【问题标题】:How to sort a hashmap by the Integer Value [duplicate]如何按整数值对哈希图进行排序[重复]
【发布时间】:2014-01-30 00:32:04
【问题描述】:
HashMap<String,Integer> map = new HashMap<String,Integer>();
map.put("a", 4);
map.put("c", 6);
map.put("b", 2);

期望的输出(HashMap):

c : 6
a : 4
b : 2

我找不到任何关于按值降序的信息。
如何做到这一点? (不喜欢加班)

【问题讨论】:

  • 你不能。但是您可以按值对 Entries (在列表或其他有序集合中一次)进行排序:开始,List entries = new ArrayList&lt;Entry&lt;String,Integer&gt;&gt;(hash.getEntries());然后排序。
  • @RC 这不是同一个问题..
  • (虽然我相信这是一个“重复”,但在另一个问题中接受的答案非常可怕 - 阅读所有回复。我还建议使用 [Array]List vs LinkedHashMap 作为输出集合。)
  • @GameDevGuru:是的,除了一些细微的差别(地图值是字符串而不是整数)。特别阅读this answer。你也可以看看这个问题:stackoverflow.com/questions/109383/…
  • 我想要一百万美元。不,赚一千万。

标签: java hashmap


【解决方案1】:

试试这个:

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("a", 4);
map.put("c", 6);
map.put("b", 2);
Object[] a = map.entrySet().toArray();
Arrays.sort(a, new Comparator() {
    public int compare(Object o1, Object o2) {
        return ((Map.Entry<String, Integer>) o2).getValue()
                   .compareTo(((Map.Entry<String, Integer>) o1).getValue());
    }
});
for (Object e : a) {
    System.out.println(((Map.Entry<String, Integer>) e).getKey() + " : "
            + ((Map.Entry<String, Integer>) e).getValue());
}

输出:

c : 6
a : 4
b : 2

【讨论】:

  • 这会将键、值对作为单个对象放入数组中,我需要能够在排序后分别检索键、值
  • 它把 Map.Entry 你可以从中分别提取键和值,见 upate
【解决方案2】:

您不能明确地对 HashMap 进行排序,但可以对条目进行排序。也许这样的事情会有所帮助:

// not yet sorted
List<Integer> intList = new ArrayList<Integer>(map.values());

Collections.sort(intList, new Comparator<Integer>() {

    public int compare(Integer o1, Integer o2) {
        // for descending order
        return o2 - o1;
    }
});

【讨论】:

  • 我相信OP希望将键和值放在一起,但是使用结果。
  • 这将键与值分开,没有想要的结果..
  • 这是真的,我认为他正在将它们打印出来或其他什么,所以他所要做的就是创建一个调用 map.getKey(value) 并返回一个字符串的方法......或任何他需要的东西。
【解决方案3】:

Hash 元素的一个特点是它们在执行诸如添加、删除等操作时速度特别快,而这正是因为它们使用 Hash 算法,这意味着它们不会保持元素的顺序我们知道作为上升或下降。这意味着使用 Hash 数据结构将无法实现您想要的。

【讨论】:

  • 这将是一个非常好的建议,但它并不能回答问题。
  • 与其说不可能,不如建议先将其转换为ArrayList ..
  • @user2864740 List intList = new ArrayList(map); ,然后使用列表。或类似的东西。
  • @GameDevGuru 但这根本不是演员阵容!对于 Java 中的所有类型转换,其中 x 是符合 T 的引用类型:((T)x) == x 为真。
  • @user2864740 我使用了错误的术语,对于造成的混乱,我深表歉意,但我想你知道我的意思。
猜你喜欢
  • 2016-03-26
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 2011-02-02
  • 1970-01-01
  • 2011-10-25
相关资源
最近更新 更多