如何对 <Integer, MyObject> Map 进行排序

11

我有这样的地图:

Map<Integer, MyEntry> map = new HashMap<Integer, MyEntry>();

我的观点是:

public class MyEntry {
    private String title;
    private String value;

    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}

在将值放入Map后,我希望对其进行排序。第一个元素最小,最后一个元素最大。

3个回答

18

如果需要按照键排序,您可以使用SortedMap - 一个常见的实现是TreeMap。由于整数具有自然排序顺序,您不需要做任何特殊的操作,只需将它们放入TreeMap即可。

如果您想按值排序,则可以使用几种技术,这个问题描述了其中的一些技术Sort a Map<Key, Value> by values (Java)


10

如果你想要排序,可以使用两种类型的LinkedHashMap或者最常用的TreeMap

Map<Integer, MyEntry> map = new LinkedHashMap<Integer, MyEntry>();

或者

Map<Integer, MyEntry> map = new TreeMap<Integer, MyEntry>();

如果要添加一些小示例,可以使用此代码:

Map<Integer, String> map = new TreeMap<Integer, String>();
map.put(1, "one");
map.put(3, "three");
map.put(2, "two"); 
// prints one two three   
for(Integer key : map.keySet()) {
   System.out.println(map.get(key);
}

一些有用的内容:

使用TreeMap进行排序的示例

另一个有用的排序示例

干杯!


LinkedHashMap 按插入顺序或访问顺序排序(这可能不是自然顺序)。这是一个有用的实现,但它在这里没有帮助。 - Andreas Dolk
如果您想添加排序元素,使用LinkedHashMap会更有帮助。例如,如果您有A、B、C三个元素,在HashMap中添加它们后顺序可能会改变,但在LinkedHashMap中它们的顺序将保持不变。我只是想表明,在LinkedHashMap中添加排序元素是一个很好的方法,而这是在HashMap中无法实现的。 - MSA

3

1
你确定 HashMap 不能被排序吗? - Josh M
从Java API文档中,“该类不保证映射的顺序;特别是,它不保证顺序会随时间保持不变。” - Jeff Storey
1
@sᴜʀᴇsʜᴀᴛᴛᴀ 我能明白你的意思。我不同意你的第一个说法,因为即使你不能动态地对HashMap进行排序,但在修改HashMap(例如添加和删除Entry)后,你仍然可以对HashMap进行排序。 - Josh M
@sᴜʀᴇsʜᴀᴛᴛᴀ 好的,但这是在假设HashMap正在以某种方式被修改的情况下。如果您手动对键进行排序(在每个addremove调用之后),并且没有执行进一步的操作来危及顺序,那么顺序会如何改变? - Josh M
仅仅是一点小提醒,我并不认为在每次add/remove操作后对HashMap进行排序是解决问题的最佳方案,我只是不同意你最初的建议,并且建议HashMap可以看起来像是已经排序了。 :) - Josh M
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接