我正在开发一个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;
}
答案 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之前的代码库的兼容性。