Java中的向量,如何在对象中返回多个向量

时间:2008-11-26 20:53:02

标签: java object vector

我正在开发一个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 个答案:

答案 0 :(得分:9)

个人而言,我完全废弃了这种方法。您似乎需要一个Product类:

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

}

答案 1 :(得分:3)

首先,使用ArrayList而不是Vector。然后使用Map作为返回对象,条目的每个值都是您的一个列表。

其次,更好的方法是创建一个实际保存每个字段的对象,并返回这些对象的java.util.List。

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

答案 2 :(得分:1)

你真的应该在这里重新考虑你的设计。您有多个向量,每个向量都具有相同类型的属性 - 库存中的项目。您可能应该将其转换为单个类,可能是InventoryItem,其成员包含名称,价格等。然后,在阅读每个项目时,您将构造具有给定属性的InventoryItem,并返回一个Vector<InventoryItem>

如果您非常依赖于跟踪所有这些个人Vector,那么您只需返回一个Vector[],其中包含您拥有的所有向量:

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

此外,正如Robin所述,您应该使用ArrayList容器而不是Vector。唯一可以改变的是,您需要将对someVector.AddElement的所有来电更改为someList.add

答案 3 :(得分:1)

你做错了。

首先,不要使用Vector。就像,永远。如果排序对您很重要,那么您需要API上的List(可能还有ArrayList或LinkedList作为实现)。

其次,你试图让大量的数组具有恰好排列的值。这几乎是不可能的。只需创建一个代表一条记录的类,然后返回那些记录。

第三:不会捕获该异常。你不知道该怎么做,而你只会迷惑自己。如果你有一个真的好主意在错误情况下做什么(只打印一个没有堆栈的错误信息,那么只能抓住异常)。

您方法的签名是最重要的部分。如果你做对了,那么实现并不重要。瞄准看起来像这样的东西:

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

答案 4 :(得分:0)

听起来应该标记为“家庭作业”。

好的,首先,您需要使用所有这些向量,还是您自己的决定?虽然有些人可能会指出使用ArrayLists更好,但我会废除它们并创建自己的Item类。

这样,您可以在每个项目上拥有1个Item实例,而不是将概念项的属性分布在多个Vector(您现在正在执行的方式)上,而是包含与该项相关的所有数据的字段。现在,您只需要一个数据结构(Vector或ArrayList)用于所有项目对象,并且可以从getInventory()返回该结构。

答案 5 :(得分:0)

声明对象的最简单方法是

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

但是这有几个问题,即Java的泛型没有具体化,所以你必须测试并转换你得到的每个向量的内容。更好的解决方案是定义一个容器对象,将每个Vector作为字段添加到那些字段中。

然而,这看起来真的没有意义。相反,您应该定义一个包含七个字段的InventoryItem。每次从文件中读取对象时,都要实例化一个新的InventoryItem并填充其字段。然后,将其添加到单个Vector中。

此外,通常建议您不要使用Vector类。相反,您应该使用ArrayList。实际上只有在需要同步属性时才能使用Vector,即使这样你也应该考虑在Collections.synchronizedList()中包装其他一些列表。

最后,一方面可以计算您想要捕获异常的地方。你应该真正捕获IOException,甚至你可能想要考虑重新抛出。此外,您应该在异常而不是System.out.println()上调用printStackTrace()。

答案 6 :(得分:0)

我发现一个好的经验法则是在对象外传递集合永远不是一个好主意。它们在你的对象中显然是有用的,但在你外面失去控制并且它们并不明显。

考虑使代码可读而不是记录它的原则。如果你收集一个集合,它如何告诉调用者传入什么?即使你使用泛型,也无法断言对集合发生的事情的控制 - 有人可能会添加它并在传递给你之后在另一个线程中删除它。

没有理由不创建包含集合的业务类以及操作它们的业务逻辑(是的,总是存在业务逻辑 - 它是您在位置周围找到的复制和粘贴代码访问该集合。)

我曾经发现令人沮丧的是,JDK似乎总是采用内置类型的数组而不是集合,但是在传达集合的想法(如传递任何基本类型)之后它更有意义。 )这不是一个好主意。

答案 7 :(得分:-1)

虽然总的来说我衷心同意使用List / ArrayList而不是Vector的建议,但知道原因很重要。事实上,我不得不强烈反对达斯汀,他说不要永远使用Vector。

Vector本质上是一个同步的ArrayList。如果您确实需要同步,那么请忽略Dustin的警告,并使用Vector。

另一个实例是Vector被证明是合理的。这就是你需要保持与Java2之前的代码库的兼容性。