【问题标题】:How can I remove an entry from a map and reorder the entries via key value?如何从地图中删除条目并通过键值对条目重新排序?
【发布时间】:2017-04-14 20:37:25
【问题描述】:

这是我一直在开发的一个小程序,用于跟踪交易中的一些金钱收益/损失。

除了这个问题,我基本上已经完成了。

deleteItem.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            Map<Integer, Entry> newMap = new LinkedHashMap<>();
            if (table.getSelectedRow() != -1) {
                System.out.println(table.getSelectedRow() + 1);
                entryTable.removeEntry(table.getSelectedRow() + 1);
                entries.remove(table.getSelectedRow() + 1);

            }

            for(Map.Entry<Integer, Entry> entry : entries.entrySet()) {
                newMap.put(entry.getKey() - 1 == 1 ? 2 : entry.getKey() - 1, entry.getValue());
            }

            if (table.getRowCount() == 1) {
                Gui.this.saveAll();
            }
            entries = newMap;
            Gui.this.saveAll();
        }
    });

所以这张地图被放入一个表格中,如果我删除除第一个以外的任何条目,一切正常。但是,如果我删除了它删除的第一个条目,但表格不会自行处理,我得出的结论一定是地图排序。

有没有一种方法可以在删除条目后获取地图的值并通过它们的键值重新排序,以便它们保持数字顺序?

【问题讨论】:

标签: java


【解决方案1】:

使用LinkedHashMap 解决您的问题的问题在于它保留了插入 顺序,而不是按实际键排序。

我建议不要按顺序存储地图条目,而是让您的 UI 在显示条目时而不是在存储条目时对其进行排序。想象一下更改 100 个地图条目 - 在最坏的情况下,必须对地图进行 100 次排序,如果您只显示一次,这是不必要的(很可能您更改地图的次数比显示/刷新它的频率更高)。

尽管按照@jaredr 的建议,如果您绝对必须保留密钥顺序,请查看SortedMap

【讨论】:

  • 嗯,所以我不认为是我的地图导致了这个问题。我认为它落到了桌子上。我通过 JSON 保存数据,如果条目是 2 而不是 1,则表显示空行,但如果您进入 JSON 文件并将 2 更改为 1,则它会正确显示。我知道地图排序应该可以解决它,但是每次我输入一个新条目/行时我应该如何对其进行排序?
  • @StuartPerera 这听起来更像是您使用三元运算符和table.getSelectedRow() != -1 等执行的逻辑中的一个缺陷,但我们必须查看更多周围的代码才能知道当然。
  • @StuartPerera 我不太确定你是否理解我的意思;即使这归结为表格逻辑,您不应该在更新地图后对其进行排序。相反,您应该让 UI 为您对表格进行排序。具体实现取决于您使用的窗口/UI 工具包。同样,我们必须查看更多代码才能找到解决方案。
  • 我更喜欢将代码保密,但好吧。 hastebin.com/fipozujuti.java 是我的代码。这里仍然缺少一些东西......
猜你喜欢
  • 2019-07-02
  • 2010-12-18
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多