java - 将 ArrayList 添加到嵌套在 Map 中的队列

标签 java collections

作业的释义: 仅使用集合框架编写一个允许用户买卖股票的程序。我不允许使用用户定义的类。

股票需要有一个 3 个字符的字符串来表示股票名称、所述股票的整数数量以及每只所述股票的出售价格。

如果用户从同一家公司购买了两份股票,则首先出售先购买的股票。先入先出。

我尝试创建一个带有字符串键的映射和一个以嵌套 ArrayList 作为值的队列。我想将带有股票价格和股票金额的 ArrayList 插入队列。我认为先进先出的队列非常适合跟踪和处理同一股票名称下的大量采购。 String 键是股票名称,所有购买的交易都将按顺序记录在该名称下。

不幸的是,我似乎无法找到一种方法来实际进入队列,而无需a)覆盖队列中已有的内容或b)仅限于无法与股票名称绑定(bind)的队列的一个实例。

看来我需要一个队列的多个单独实例,每个实例都在不同的字符串键下,但我不知道如何在没有用户定义的类的情况下正确实现它。

您可以在提供的代码中查看嵌套集合的其他尝试。所有这些都受到以下事实的限制:我错过了有关集合导航的一些内容,或者也许我对集合的理解总体上是有缺陷的。

public static void buy( Map<String, Queue< ArrayList<Integer> >> stockInfo, Queue< ArrayList<Integer> > stockQueue ) {
    System.out.print("Please enter a set of three characters: ");
    Scanner scanner = new Scanner(System.in);

    var stockName = scanner.nextLine();

    while (stockName.length() != STOCK_NAME_COUNT) {
        System.out.printf("Invalid number of characters: %d \n", stockName.length());
        System.out.print("Please enter a set of three characters: ");
        stockName = scanner.nextLine();
    }

    System.out.print("Please enter number of stocks: ");
    var stockNumber = scanner.nextInt();
    while (stockNumber <= 0) {
        System.out.printf("Invalid stock amount: %d \n", stockNumber);
        System.out.print("Please enter number of stocks: ");
        stockNumber = scanner.nextInt();
    }

    System.out.print("Please enter stock price: ");
    var stockPrice = scanner.nextInt();
    while (stockPrice <= 0) {
        System.out.printf("Invalid price: %d \n", stockPrice);
        System.out.print("Please enter stock price: ");
        stockNumber = scanner.nextInt();
    }

    ArrayList<Integer>shares=new ArrayList<Integer>();
    shares.add(stockNumber);
    shares.add(stockPrice);
    stockQueue.add(shares);
    stockInfo.put(stockName, stockQueue);
}

...

public static void main(String[] args) {

    //Set<String> stockNames = new HashSet<String>();
    //Set<Queue< ArrayList<Integer> >> StockInfo = new HashSet<Queue< ArrayList<Integer> >>();

    Map<String, Queue< ArrayList<Integer> >> stockInfo = new LinkedHashMap<String,Queue< ArrayList<Integer> >>();
    Queue< ArrayList<Integer> > stockQueue = new LinkedList< ArrayList<Integer> >();

    //Set<Queue< ArrayList<Integer> >> stockInfo = new HashSet<Queue< ArrayList<Integer> >> ();

    //Queue< ArrayList<Integer> > stockInfo = new LinkedList< ArrayList<Integer> >();

    var selection = menu("Choose option: ");

    while (selection != 'E'){
        if (selection == 'B'){
            buy(stockInfo, stockQueue);
            System.out.println(stockInfo);
        } else {
            //sale(stockInfo);
        }
        selection = menu("Choose option: ");
    }

    System.out.println("Goodbye!");
}

a. Buy (B or b)

b. Sale (S or s)

c. Exit (E or e)

Choose option: b

Please enter a set of three characters: asd

Please enter number of stocks: 120

Please enter stock price: 10

{asd=[[120, 10]]}

a. Buy (B or b)

b. Sale (S or s)

c. Exit (E or e)

Choose option: b

Please enter a set of three characters: asd

Please enter number of stocks: 100

Please enter stock price: 14

{asd=[[120, 10], [100, 14]]}

a. Buy (B or b)

b. Sale (S or s)

c. Exit (E or e)

Choose option: b

Please enter a set of three characters: asd

Please enter number of stocks: 120

Please enter stock price: 10

{asd=[[120, 10], [100, 14], [120, 10]]}

a. Buy (B or b)

b. Sale (S or s)

c. Exit (E or e)

Choose option: b

Please enter a set of three characters: qwe

Please enter number of stocks: 50

Please enter stock price: 13

{asd=[[120, 10], [100, 14], [120, 10], [50, 13]], qwe=[[120, 10], [100, 14], [120, 10], [50, 13]]}

a. Buy (B or b)

b. Sale (S or s)

c. Exit (E or e)

Choose option: e

Goodbye!

我没有收到语法错误,我不确定我所想到的逻辑是否可以用我当前的工具集实现。

如果您查看我的输出,您可以看到我的 ArrayList 队列在每个字符串键上都发生了更改。我知道为什么会这样,但是如果我在函数中声明一个新的队列实例,它将覆盖该键下已有的内容。

最佳答案

在您的 buy() 方法中,您始终会覆盖 map 中的队列。您需要先尝试检索现有队列(否则创建一个新队列),然后在必要时对其进行修改:

ArrayList<Integer>shares=new ArrayList<Integer>();
shares.add(stockNumber);
shares.add(stockPrice);

// this retrieves the existing queue, or creates and stores a new one if there wasn't one already
Queue<ArrayList<Integer>> stockQueue = stockInfo.getOrDefault(stockName, new LinkedList<ArrayList<Integer>>());

stockQueue.add(shares);

然后您可以删除此行:stockInfo.put(stockName, stockQueue);,因为 getOrDefault() 方法会将新创建的队列放入映射中。

您需要从 buy() 方法签名中删除 stockQueue 参数。

关于java - 将 ArrayList 添加到嵌套在 Map 中的队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58403396/

相关文章:

java - 如何排列一组有限制的点?

java - Java中LinkedList对象上使用的poll()、pollFirst()、pollLast()、removeFirst()和remove()方法之间有什么区别?

java - 为什么 ArrayList 有 "implements List"?

c# - 单独收集 2 个不同的新系列

java - LinkedTransferQueue 线程安全吗?

c# - 为什么从 ConditionalWeakTable 中删除键时 IEnumerator.MoveNext 不抛出异常?

java - 编译时出错

java - 更改 TextView 字体时应用程序崩溃

java - 构造函数中的参数检查

java - 通过fxml添加observableHashMap