【问题标题】:sorting of HashMap in JavaJava中HashMap的排序
【发布时间】:2017-02-22 15:10:25
【问题描述】:

我有一个地图,里面有键和值

键:- 案例 1,案例 2……案例 10

值:- 一月、二月......十月

现在当我把这张地图放在数组列表中(这样我就可以对其进行排序)

for (String key : dataValueMap.keySet()) {
    System.out.println(key + " " + dataValueMap.get(key));
}
ArrayList<String> keys = new ArrayList<String>(
dataValueMap.keySet());
Collections.sort(keys);
for (String counter : keys) {
   System.out.println(counter); >>>>>BUT it prints like :- case 1  then  case 10  then  case 2, case 3, case 4 etc.
}

请帮助解决此问题,

提前致谢

【问题讨论】:

  • 嗯,是的,你有 strings,并且作为 strings,“10”排在“2”之前。如果你所有的条目都是整数,你应该这样对待它们。不过,目前尚不清楚这与地图有什么关系——本质上你只是用字符串填充ArrayList&lt;String&gt;。它们恰好是地图中的键这一事实无关紧要。
  • (如果您只有键 1-12,我建议您只使用数组...)

标签: java sorting arraylist hashmap


【解决方案1】:

您只需为您的字符串版本定义一个新的自定义Comparator,并且可以编写任何逻辑来比较列表中的两个字符串。

List<String> keys = new ArrayList<>();

keys.add("case 10");    
keys.add("case 3");        
keys.add("case 1");
keys.add("case 2");

Comparator<String> comparator = new Comparator<String>(){
    @Override
    public int compare(String s1, String s2) {
        return Integer.compare(Integer.parseInt(s1.substring(5)), Integer.parseInt(s2.substring(5)));
    }  
};

Collections.sort(keys, comparator);
for (String counter : keys) {
    System.out.println(counter);
}

【讨论】:

    【解决方案2】:

    如果您确定密钥格式,则可以将其按空格分割,并将实际值与比较器进行比较,例如:

    Map<String, Object> myMap = 
            new TreeMap<String, Object>(new Comparator<String>()
            {
                public int compare(String o1, String o2)
                {
                    Integer value1 = Integer.parseInt(o1.split("\\s+")[1]);
                    Integer value2 = Integer.parseInt(o2.split("\\s+")[1]);
                    return value1.compareTo(value2);
                } 
    });
    

    虽然如果密钥格式不正确会中断,但我们可以根据预期行为添加处理。

    【讨论】:

      【解决方案3】:

      使用自定义的Comparator 实现对您的收藏进行排序。这需要并比较密钥的整数,但依赖于格式大小写 n

      示例

      List<String> keys = new ArrayList<>();
      keys.add("case 10");        
      keys.add("case 3");        
      keys.add("case 1");
      keys.add("case 2");        
      Collections.sort(keys, new Comparator<String>() {
      
          @Override
          public int compare(String s1, String s2) {
              s1 = s1.split(" ")[1];
              s2 = s2.split(" ")[1];
              return Integer.compare(Integer.parseInt(s1), Integer.parseInt(s2));
          }
      });
      
      for (String key : keys) {
          System.out.println(key);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-27
        • 2011-12-24
        • 1970-01-01
        • 1970-01-01
        • 2013-06-10
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多