2008-11-26 2 views
0

Я работаю над программой java, и у меня есть несколько векторов, определенных и заполненных (из файла) внутри метода. Мне нужно вернуть содержимое всех векторов из метода. Я слышал, что вы можете поместить их все в один объект, чтобы вернуть их. Это возможно, и если да, то как? Если нет, есть ли у вас какие-либо возможные решения для меня? Заранее спасибо за вашу помощь!Векторы в Java, как вернуть несколько векторов в объект

Вот фрагмент кода:

Object getInventory() 
{  
     Vector<String> itemID=new Vector<String>(); 
     Vector<String> itemName=new Vector<String>(); 
     Vector<Integer> pOrdered=new Vector<Integer>(); 
     Vector<Integer> pInStore=new Vector<Integer>(); 
     Vector<Integer> pSold=new Vector<Integer>(); 
     Vector<Double> manufPrice=new Vector<Double>(); 
     Vector<Double> sellingPrice=new Vector<Double>(); 
     Object inventoryItem=new Object(); //object to store vectors in 

    try 
    { 
     Scanner infile= new Scanner(new FileReader("Ch10Ex16Data.txt")); 

     int i=0; 

     while (infile.hasNext()) 
     {     
      itemID.addElement(infile.next());     
      itemName.addElement(infile.next()+infile.nextLine()); 
      pOrdered.addElement(infile.nextInt()); 
      pInStore.addElement(pOrdered.elementAt(i)); 
      pSold.addElement(0); 
      manufPrice.addElement(infile.nextDouble()); 
      sellingPrice.addElement(infile.nextDouble()); 
      i++; 

     } 
     infile.close(); 

     System.out.println(itemID); 
     System.out.println(itemName); 
     System.out.println(pOrdered); 
     System.out.println(pInStore); 
     System.out.println(pSold); 
     System.out.println(manufPrice); 
     System.out.println(sellingPrice); 

    } 
    catch (Exception f) 
    { 
     System.out.print(f); 
    } 

    return inventoryItem; 
} 

ответ

9

Лично я полностью откажусь от этого подхода. Похоже, вам нужен класс продукта:

public class Product { 

    private String itemName; 
    private int itemID; 
    // etc etc 

    public Product(String itemName, int itemID) { 
     this.itemName = itemName; 
     this.itemID = itemID; 
     // etc etc 
    } 

    public String getItemName() { 
     return itemName; 
    } 

    public int getItemID() { 
     return itemID; 
    } 

    // etc etc 
} 

Тогда что-то вроде этого:

public class Invertory { 

private List<Product> products = new ArrayList<Product> 
// etc etc 

public Inventory(String fileName) throws IOException { 
     // Load file, 
     // Read each product, 
     products.add(new Product(...product arguments); //add to array 
    } 

    public Product[] getProducts() { 
     return products.toArray(new Product[]{}); 
    } 

}

+0

Благодарим вас за подробное описание, я, вероятно, сослаюсь на это, чтобы это сделать, спасибо! Как я уже сказал, все еще новичок в Java, поэтому некоторые из них путают ... – Danielle 2008-11-26 21:11:01

3

Прежде всего, используйте ArrayList вместо вектора. Затем используйте Map в качестве возвращаемого объекта, каждое значение которого является одним из ваших списков.

Во-вторых, гораздо лучший подход заключается в создании объекта, который фактически удерживает каждое из ваших полей и возвращает java.util.List этих объектов.

public class Item 
{ 
    String id; 
    String name 
    Integer pOrdered;   
    Integer inStore; 
      : 
      : 
+0

Да, о ArrayList, это «относительно новое» дополнение к Java? Потому что моя (не хорошая) книга не говорит о них ... Хммм ... Мне определенно нужна новая книга Java ... Спасибо за помощь! – Danielle 2008-11-26 21:13:47

+0

Он был добавлен в J2SE 1.5, поэтому ... 2004? Что-то вроде того. – 2008-11-26 21:21:56

+0

ArrayList был добавлен в 1.2, декабрь 1998 года (вау! Что долго ?!). Он должен быть рассмотрен в разделе «Коллекции Java». – 2008-11-26 21:23:52

1

Вы действительно должны пересмотреть свой дизайн здесь. У вас есть несколько векторов, каждый со свойствами одного и того же типа вещей - предмет в вашем инвентаре. Вероятно, вы должны превратить это в один класс, возможно, InventoryItem, с членами для имени, цены и т. Д. Затем при чтении в каждом элементе вы создаете InventoryItem с данными свойствами и возвращаете один номер Vector<InventoryItem>.

Если вы действительно прилагается к отслеживанию всех этих отдельных Vector с, вы могли бы просто вернуть Vector[] со всеми векторами у вас есть:

return new Vector[] { itemID, itemName, pOrdered, pInStore, pSold, manufPrice, sellingPrice }; 

Кроме того, как Robin говорит, вы должны использовать ArrayList контейнер вместо Vector. Единственное, что изменится, это то, что вам нужно изменить все вызовы на someVector.AddElement на someList.add.

0

Похоже, это должно быть помечено «Домашнее задание».

Хорошо, прежде всего, вы должны использовать все эти Векторы или это ваше собственное решение? Хотя некоторые могут указать, что лучше использовать ArrayLists, я бы покончил с ними и создал свой собственный класс Item.

Таким образом, вместо того, чтобы иметь свойства концептуального элемента, распределенные по нескольким векторам (то, как вы сейчас это делаете), у вас есть 1 экземпляр элемента для каждого элемента, с полями для всех данных, относящихся к этому элементу. Теперь вам нужна только одна структура данных (Vector или ArrayList) для всех объектов объекта, и вы можете вернуть эту структуру из getInventory().

1

Вы делаете несколько вещей неправильно.

Во-первых, не используйте Vector. Как обычно. Если для вас важны заказы, вам нужен список в API (и, возможно, ArrayList или LinkedList в качестве реализации).

Во-вторых, вы пытаетесь иметь большое количество массивов, имеющих значения, которые выходят из строя.Это почти невозможно использовать. Просто создайте класс, представляющий одну запись, и верните список из них.

В-третьих: не поймать это исключение. Вы не знаете, что с этим делать, и вы просто будете путать себя. Только поймайте исключение, если у вас есть действительно хорошая идея, что делать в случае ошибки (распечатка сообщения об ошибке без стека почти никогда не будет правильной).

Подпись вашего метода является самой важной частью. Если вы получите это право, реализация не имеет значения почти так же. Стремитесь к чему-то, что выглядит следующим образом:

List<Item> getInventory(File input) throws IOException { 
} 
0

Самый простой способ объявить объект будет нечто вроде

List<Vector<? extends Object>> inventoryItem = new ArrayList<Vector<? extends Object>> 

но есть несколько проблем, а именно, что дженерики в Java не овеществленный, так что вы должны проверять и отображать содержимое каждого вектора, который вы возвращаете. Лучшим решением было бы определить объект контейнера, который имеет каждый из векторов в качестве полей и добавить к ним.

Однако, похоже, что это действительно отсутствует. Вместо этого вы должны определить InventoryItem, у которого есть каждое из ваших семи полей. Каждый раз, когда вы читаете объект из файла, создайте новый экземпляр InventoryItem и заполните его поля. Затем вы добавляете это к одному вектору.

Также рекомендуется, чтобы вы не использовали класс Vector. Вместо этого вы должны использовать ArrayList. Вектор действительно должен использоваться только в том случае, если вам нужны его свойства синхронизации, и даже тогда вы должны рассмотреть возможность переноса некоторого другого списка в Collections.synchronizedList().

Наконец, места, где вы хотите поймать только Исключение, можно пересчитать с одной стороны. Вы действительно должны поймать исключение IOException и даже, возможно, захотите рассмотреть вопрос о простом восстановлении. Кроме того, вы должны вызывать printStackTrace() для исключения, а не System.out.println().

-1

Хотя я в целом согласен с советом использовать List/ArrayList вместо Vector, важно знать, почему. В самом деле, я должен категорически не соглашаться с Дастином, который говорит, что не использовать Vector «ever».

Вектор - это, по сути, синхронизированный ArrayList. Если вам действительно нужна синхронизация, во что бы то ни стало, не обращайте внимания на предостережение Дастина и используйте «Вектор».

Существует еще один пример, в котором Вектор оправдан. И именно тогда вам необходимо поддерживать совместимость с базой кода pre-Java2.

0

Я нахожу, что хорошее эмпирическое правило состоит в том, что никогда не рекомендуется передавать коллекции вокруг ваших объектов. Они, очевидно, полезны внутри вашего объекта, но вне вас теряют контроль, и они не очевидны.

Рассмотрите принцип чтения кода вместо его документирования. Если вы берете коллекцию, как это говорит вызывающему, что передать? Даже если вы используете дженерики, нет способа утверждать, что происходит с коллекцией - кто-то может добавлять к ней и удалять из нее в другом потоке после того, как он передан вам.

Нет оснований не создавать бизнес-класс, содержащий ваши коллекции, а также бизнес-логику для управления ими (да, всегда есть бизнес-логика - это код копирования и вставки, который вы найдете вокруг мест, где вы получаете доступ к коллекции).

Раньше я расстраивал то, что JDK всегда, кажется, использует массивы встроенных типов, а не коллекций, но имеет смысл сделать более понятным с идеей, что передача коллекций (например, тип) - это не очень хорошая идея.

Смежные вопросы