2015-09-18 84 views
1

不能把我的頭放在下面:有兩個類 - 「Item」,其中設置了屬性(Name,Price)和構造函數,以及主要的「Store」。在最後一個 - Arraylist中,根據用戶輸入填充項目。代碼起作用。使用用戶輸入將對象添加到ArrayList的方法

這裏有一個問題:除了「ArrayList listOfItems = new ArrayList();」之外,是否有任何方法可以從主類中取出所有內容:行成一個方法「addItem()」,然後調用方法?我不知道怎麼做。試了很多。

謝謝

package store; 

import java.util.ArrayList; 
import java.util.Scanner; 

public class Store extends Item { 

public static void main(String[] args) {   

    ArrayList<Item> listOfItems=new ArrayList<Item>(); 

    for(int i=0;i<2;i++){ 

     System.out.println("ENTER NAME"); 
     Scanner addName=new Scanner (System.in); 
     String name=(addName.nextLine()); 

     System.out.println("ENTER PRICE"); 
     Scanner addPrice=new Scanner (System.in); 
     double price=(addPrice.nextDouble()); 

     listOfItems.add(new Item(name,price)); 
    } 
    for(Item list:listOfItems){ 
     System.out.println("NAME "+list.getName()+", PRICE "+list.getPrice()); 
    } 
    } 
} 
+0

你想在外面申報清單嗎? –

+0

您正在將您嘗試存儲的類擴展到Array列表中? ArrayList應該在Extended類之外聲明。 – ductiletoaster

回答

1

這會爲你工作:

package store; 

import java.util.ArrayList; 
import java.util.Scanner; 

public class Store { 
    private static class Item { 
     private String name; 
     private double price; 

     public Item(String name, double price) { 
      this.name = name; 
      this.price = price; 
     } 

     public String getName() { 
      return name; 
     } 

     public double getPrice() { 
      return price; 
     } 
    } 

    public static void main(String[] args) { 
     ArrayList<Item> listOfItems = new ArrayList<Item>(); 
     addItem(listOfItems); 
    } 

    private static void addItem(ArrayList<Item> listOfItems) { 
     for (int i = 0; i < 2; i++) { 
      System.out.println("ENTER NAME"); 
      Scanner addName = new Scanner(System.in); 
      String name = (addName.nextLine()); 

      System.out.println("ENTER PRICE"); 
      Scanner addPrice = new Scanner(System.in); 
      double price = (addPrice.nextDouble()); 

      listOfItems.add(new Item(name, price)); 
     } 
     for (Item list : listOfItems) { 
      System.out.println("NAME " + list.getName() + ", PRICE " + list.getPrice()); 
     } 
    } 
} 

我定義的類Item分開,使其編譯。此外,我從商店中刪除extends Item,因爲它不是必需的。

+0

好多了。嵌套類「Item」使得更有意義。 – ductiletoaster

0

我並不確切地知道,如果這是你在找什麼,但你可以嘗試以下解決方案:

public class Store extends Item { 

public static void main(String[] args) { 

    ArrayList<Item> listOfItems=new ArrayList<Item>(); 

    addItem(listOfItems); 

    for(Item list:listOfItems){ 
     System.out.println("NAME "+list.getName()+", PRICE "+list.getPrice()); 
    } 

} 

private static void addItem(ArrayList<Item> li) { 

    for(int i=0;i<2;i++){ 

     System.out.println("ENTER NAME"); 
     Scanner addName=new Scanner (System.in); 
     String name=(addName.nextLine()); 

     System.out.println("ENTER PRICE"); 
     Scanner addPrice=new Scanner (System.in); 
     double price=(addPrice.nextDouble()); 

     li.add(new Item(name,price)); 
    } 

} 

}

你也許還試圖聲明之外的主要ArrayList中:

public class Store extends Item { 

private static ArrayList<Item> listOfItems; 

public static void main(String[] args) { 

    listOfItems=new ArrayList<Item>(); 

    addItem(); 

    for(Item list:listOfItems){ 
     System.out.println("NAME "+list.getName()+", PRICE "+list.getPrice()); 
    } 

} 

private static void addItem() { 

    for(int i=0;i<2;i++){ 

     System.out.println("ENTER NAME"); 
     Scanner addName=new Scanner (System.in); 
     String name=(addName.nextLine()); 

     System.out.println("ENTER PRICE"); 
     Scanner addPrice=new Scanner (System.in); 
     double price=(addPrice.nextDouble()); 

     listOfItems.add(new Item(name,price)); 
    } 

} 

}

讓我知道如果你需要進一步的幫助! :)

+0

謝謝你的回覆..我是新來的Java和最易懂的解決方案,我發現沒有得到「非靜態方法不能用於靜態...」是創建一個包含非靜態方法。示例:Store s = new Store();然後使用非靜態方法作爲s.addItem(); – KTM950

0

您可以使用更好的面向對象方法來解決您的問題。

Store extends Items這沒有意義。商店包含商品,因此您只需要一個像listOfItems這樣的變量即可保存商店的所有商品。

公共類商店是一個很好的候選人使用Singleton Pattern

關於你的listOfItems的構造:當一個List足夠時,你只需要使用一個List。另外,Java 7提供了對通用實例創建的類型推斷。

From The Java SE Documentation:可更換調用通用類的構造具有空組類型參數(<>),只要該編譯器可以從上下文推斷類型參數所需的類型的參數。這對尖括號非正式地稱爲鑽石。

所以,你應該用List<Item> listOfItems = new ArrayList<>(),而不是ArrayList<Item> listOfItems = new ArrayList<Item>()

每次您使用掃描儀,你應該關閉的時間。

單例:

public class Store { 
private static final Store INSTANCE = new Store(); 
private List<Item> listOfItems = new ArrayList<>(); 

private Store() { 
    // Private Constructor 
    // will prevent the instantiation of this class directly 
} 

public static Store getInstance() { 
    return INSTANCE; 
} 

public void addItems(List<Item> newlistOfItems) { 
    listOfItems.addAll(newlistOfItems); 
} 

public String printListOfItems() { 
    StringBuilder sb = new StringBuilder(); 
    for (Item item : listOfItems) { 
     sb.append(" [NAME : " + item.getName() + ", PRICE : " + item.getPrice() + "]"); 
    } 
    return sb.toString(); 
} 

}

的POJO Item類

public class Item { 
    private String name; 
    private double price; 

    public Item(String name, double price) { 
     this.name = name; 
     this.price = price; 
    } 

    public String getName() { 
     return name; 
    } 

    public double getPrice() { 
     return price; 
    } 
} 

服務接口的項目管理:

public interface ItemManagerService { 
    List<Item> createListOfItems(); 
} 

實施:

public class ItemManagerServiceImpl implements ItemManagerService { 
    @Override 
    public List<Item> createListOfItems() { 
     List<Item> newListOfItems = new ArrayList<>(); 
     Scanner scanner = new Scanner(System.in); 

     try { 
      do { 
       System.out.println("ENTER NAME"); 
       String name = scanner.nextLine(); 

       System.out.println("ENTER PRICE"); 
       while (!scanner.hasNextDouble()) { 
        System.out.print("You must enter a valid number! Try again: "); 
        scanner.next(); 
       } 

       double price = scanner.nextDouble(); 
       Item item = new Item(name, price); 
       newListOfItems.add(item); 

       System.out.println("Continue?[Y/N]"); 
       scanner.nextLine(); 
      } while (scanner.nextLine().equalsIgnoreCase("y")); 
     } finally { 
      scanner.close(); 
     } 
     return newListOfItems; 
    } 
} 

一個簡單的測試:

public class MainApp { 

    public static void main(String[] args) { 
     ItemManagerService itemManagerService = new ItemManagerServiceImpl(); 
     List<Item> newlistOfItems = itemManagerService.createListOfItems(); 

     Store.getInstance().addItems(newlistOfItems); 
     System.out.println(Store.getInstance().printListOfItems()); 
    } 
} 

控制檯輸出:

ENTER NAME 
table 
ENTER PRICE 
12 
Continue?[Y/N] 
y 
ENTER NAME 
car 
ENTER PRICE 
50,8 
Continue?[Y/N] 
n 
[NAME : table, PRICE : 12.0] [NAME : car, PRICE : 50.8]