【问题标题】:method to add objects to ArrayList using user input使用用户输入将对象添加到 ArrayList 的方法
【发布时间】:2015-12-16 01:56:50
【问题描述】:

无法理解以下内容:有 2 个类 - “Item”,其中设置了属性(名称、价格)和构造函数,以及主要的“Store”。在最后一个 - 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());
    }
  }
}

【问题讨论】:

  • 你想在外面声明列表?
  • 您正在扩展您尝试在数组列表中存储的类? ArrayList 应该在 Extended 类之外声明。

标签: java methods arraylist


【解决方案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,因为它不需要。

【讨论】:

  • 好多了。嵌套类Item 更有意义。
【解决方案2】:

我不知道这是否是您正在寻找的,但您可以尝试以下解决方案:

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));
    }

}

}

您也可以尝试在 main 之外声明 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));
    }

}

}

如果您需要进一步的帮助,请告诉我! :)

【讨论】:

  • 感谢您的回复。我是 Java 新手,我发现没有得到“不能在静态中使用非静态方法...”的最容易理解的解决方案是创建一个包含非静态方法的类的实例。示例:商店 s=new Store();然后使用非静态方法作为 s.addItem();
【解决方案3】:

您可以使用更好的面向对象方法来解决您的问题。

Store extends Items这没有意义。商店包含物品,因此您只需要像 listOfItems 这样的变量来保存商店的所有物品。

您的 public class Store 是使用 Singleton Pattern 的理想人选。

关于listOfItems的构造:当一个List就足够了,那么你应该只使用一个List。此外,java 7 为通用实例创建提供类型推断。

From The Java SE Documentation:只要编译器可以从上下文中推断类型参数,您就可以用一组空类型参数 () 替换调用泛型类的构造函数所需的类型参数。这对尖括号被非正式地称为菱形。

所以,你应该使用List&lt;Item&gt; listOfItems = new ArrayList&lt;&gt;() 而不是 ArrayList&lt;Item&gt; listOfItems = new ArrayList&lt;Item&gt;()

每次使用 Scanner 时都应该关闭它。

单身人士:

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 项目类

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-02
    • 2012-04-14
    • 2015-07-19
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    相关资源
    最近更新 更多