从Java中的文件将数据读入数组列表时出现问题

时间:2014-02-23 20:54:39

标签: java

所以这是我第一次在这里发帖。我试图从文件中读取数据,从该数据创建多个对象,然后将创建的对象放入ArrayList。但每次我尝试过,我只会得到同一个对象的多个副本,而不是不同的对象。我在我的智慧结束。

无论如何,这里是从文件中读取数据的方法的代码。在此先感谢您的帮助!

public void openShop() throws IOException{
    System.out.println("What is the name of the shop?");
    shopName = keyboard.nextLine();
    setShopFile();
    File openShop = new File(shopFile);
    if (openShop.isFile()){
        Scanner shopData = new Scanner(openShop);
            shopName = shopData.nextLine();
            shopOwner = shopData.nextLine();

            while (shopData.hasNextLine()){
                shopItem.setName(shopData.nextLine());
                shopItem.setPrice(Double.parseDouble(shopData.nextLine()));
                shopItem.setVintage(Boolean.parseBoolean(shopData.nextLine()));
                shopItem.setNumberAvailable(Integer.parseInt(shopData.nextLine()));
                shopItem.setSellerName(shopData.nextLine());
                shopInventory.add(shopItem);

            }
            setNumberOfItems();
    }
    else
        System.out.println("That shop does not exist. Please try to open" +
                          "the shop again.");
    isSaved = true;
}

3 个答案:

答案 0 :(得分:3)

在你的while循环中你应该创建一个对象的新实例。否则,它最终只会对现有实例进行修改。

正确的方式:

while (shopData.hasNextLine()){
   shopItem = new ShopItem(); //This will create a new Object of type ShopItem
   shopItem.setName(shopData.nextLine());
   shopItem.setPrice(Double.parseDouble(shopData.nextLine()));
   shopItem.setVintage(Boolean.parseBoolean(shopData.nextLine()));
   shopItem.setNumberAvailable(Integer.parseInt(shopData.nextLine()));
   shopItem.setSellerName(shopData.nextLine());
   shopInventory.add(shopItem);
}

答案 1 :(得分:1)

我无法看到你在哪里创建shopItem实例。

但是如果你每次都没有创建一个新的ShopItem,那么每次你绕过循环你只是更新一个实例,然后将它添加到shopInventory。

答案 2 :(得分:1)

使用完全相同的对象填充ArrayList。您应该创建ShopItem的新实例:

while (shopData.hasNextLine()){
  ShopItem shopItem = new ShopItem();
  shopItem.setName(shopData.nextLine());
  ...
}