首页 > 解决方案 > 如何让 Hashmap 为一个键分配多个值?

问题描述

嗨,您在下面看到的代码是基于火车预订系统界面的,我包含了一个名为 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'}

标签: javaarraysuser-interfacejavafxhashmap

解决方案


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

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


推荐阅读