【问题标题】:Sort HashMap keys based on the key size根据键大小对 HashMap 键进行排序
【发布时间】:2014-04-27 06:02:16
【问题描述】:

我有一个HashMap,其中的键是字符串。我需要获取密钥并根据密钥大小(即字符串长度)对其进行排序,然后将其存储在一些 ArrayList 中。

注意:如果两个键大小相同,那么我们可以按任意顺序放置。

例如。

hm.put("abc","hi");
hm.put("A","hi");
hm.put("ab","hi");
hm.put("a","hi");

我的 ArrayList 应该按顺序排列元素 abc,ab,a,A

谁能告诉我最好的方法是什么。

【问题讨论】:

  • 您无法对HashMap 进行就地排序;使用自定义 Comparator 创建一个 TreeMap 并在其中添加所有 HashMap 条目。
  • 参见Comparator docs.oracle.com/javase/7/docs/api/java/util/Comparator.html 思考如何实现它并在sort(keys, yourComparator); 中使用它
  • 密钥大小是指字符串长度吗?
  • @Duncan - 是的邓肯

标签: java sorting arraylist hashmap


【解决方案1】:

您可以使用自定义Comparator 按长度对键进行排序,如下所示:

List<String> s = new ArrayList<>(hm.keySet());
Collections.sort(s, new Comparator<String>(){
            @Override
            public int compare(String s1, String s2){
                 return Integer.compare(s2.length(), s1.length());
            }
});


另一种可能性是使用TreeSet,在这里还为其构造函数提供自定义Comparator
TreeSet<String> ts = new TreeSet<>(new Comparator<String>(){
                     @Override
                     public int compare(String s1, String s2){
                           int cmp = Integer.compare(s2.length(), s1.length());
                           return cmp != 0 ? cmp : s1.compareTo(s2);
                     }
});
ts.addAll(hm.keySet());

这里请注意,如果您比较的一对Strings 的长度相同,您还必须比较它们的字典顺序,否则TreeSet 将只包含具有不同长度的Strings(即“a”或“A”都不会添加到集合中)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 2017-09-22
    • 2013-11-21
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2011-04-05
    • 2011-12-11
    相关资源
    最近更新 更多