Векторы в Java, как вернуть несколько векторов в объекте - PullRequest
0 голосов
/ 26 ноября 2008

Я работаю над программой 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;
}

Ответы [ 8 ]

9 голосов
/ 27 ноября 2008

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

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[]{});
  }

}

3 голосов
/ 27 ноября 2008

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

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

public class Item
{
    String id;
    String name
    Integer pOrdered;        
    Integer inStore;
           :
           :
1 голос
/ 27 ноября 2008

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

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

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

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

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

List<Item> getInventory(File input) throws IOException {
}
1 голос
/ 27 ноября 2008

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

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

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

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

0 голосов
/ 27 ноября 2008

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

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

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

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

0 голосов
/ 27 ноября 2008

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

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

Есть еще один случай, когда вектор оправдан. И именно тогда вам необходимо поддерживать совместимость с базой кода, предшествующей Java2.

0 голосов
/ 27 ноября 2008

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

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

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

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

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

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

0 голосов
/ 27 ноября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...