【问题标题】:How can I make a Hashmap assign multiple values for a key? [duplicate]如何让 Hashmap 为一个键分配多个值? [复制]
【发布时间】:2020-06-20 12:14:27
【问题描述】:

您好,您在下面看到的代码是基于火车预订系统界面的,我包含了一个名为 addCustomer 的方法,它会提示一个文本字段来请求客户名称(Hashmap Key),然后在提交名称后,然后投影座位按钮,允许客户选择其姓名下的多个座位,所选座位号存储为客户姓名的键值。座位容量限制为 42 个座位。

[界面如下:IMAGE 但是设置 Hashmap 是我的主要问题,它只为每个客户名称存储一个座位号。

public static final int SEATING_CAPACITY = 42;

public static void addCustomer(Button[] viewBtn, GridPane pane, int[] keep, TextField tf, HashMap customerBooked, Button submit) {

    pane.setVgap(10);
    pane.setHgap(35);
    pane.setPadding(new Insets(10, 10, 10, 280));

    submit.setOnAction(event -> {
        int i = 0;
        for (int y = 1; y <= 14; y++) {
            for (int x = 1; x <= 3; x++) {

                i++;
                String num = "" + i;
                i--;
                viewBtn[i] = new Button(num);
                viewBtn[i].setId("Seat " + i);
                viewBtn[i].setDisable(true);

                pane.add(viewBtn[i], x, y);
                viewBtn[i].setMaxSize(50, 150);
                viewBtn[i].setDisable(false);

                if (keep[i] == 1) {
                    viewBtn[i].setStyle("-fx-background-color: red;");
                } else {
                    viewBtn[i].setStyle("-fx-background-color: #03fc98;");

                    int finalI = i;
                    viewBtn[i].setOnAction(new EventHandler<ActionEvent>() {
                        @Override
                        public void handle(ActionEvent event) {
                            viewBtn[finalI].setStyle("-fx-background-color: red;");
                            keep[finalI] = 1;
                            String name = new String(tf.getText());
                            customerBooked.put(name, viewBtn[finalI]);
                        }
                    });
                }
                i++;
            }
        }
    });
    System.out.println(customerBooked);
}

当我开始打印 Hashmap 时,我注意到这种情况发生了,例如,当我输入 Sam 的名字并单击以下按钮时,座位为 24、27、33。它最终占据了最后一个座位。

{Sam=Button[id=Seat 32, styleClass=button]'33'}

除此之外,按钮样式和座位 ID 也被放置到我不想考虑的座位值。

我需要修复它,使它看起来像下面的那样。这样我可以将它调整为我的其他方法,例如按名称搜索客户座位或根据名称删除。

{Sam='24','27','33',Jane='25'}

【问题讨论】:

  • 你为什么使用new String(...)?我几乎每天都看到,但这对任何事情都没有好处。在 Java 中,所有变量都是引用,因此您可以简单地引用现有字符串而不是复制它。如有必要,垃圾收集器会自动将对象移动到另一个内存区域。您不必害怕从本地堆栈返回对象。
  • 请阅读 java 基础知识,尤其是 Map 的特性。

标签: java arrays user-interface javafx hashmap


【解决方案1】:

HashMap 的目的是为每个键存储一个条目。除非您使用列表作为值,否则您想要实现的 HashMap 是不可能的,例如HashMap&lt;String,ArrayList&lt;String&gt;&gt;.

有几个提供MultiMap 的库可以满足您的需求。见https://www.baeldung.com/java-map-duplicate-keys

【讨论】:

  • 当我将它放在事件处理程序之外时,它之前确实开始为每个名称获取更多值,它在提交按钮的事件处理程序内的原因是我需要将文本放入名称数组。
  • @Genesis_Kitty 然后您更改了其他内容并将其放在 eventHandler 之外 .. 普通地图 从不 每个键存储多个值,独立于位置他们被填满了。
猜你喜欢
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 2015-12-28
  • 2019-09-06
  • 2015-08-22
  • 1970-01-01
相关资源
最近更新 更多