【问题标题】:How to sort alphanumeric keys in Hashmap in best possible manner?如何以最佳方式对 Hashmap 中的字母数字键进行排序?
【发布时间】:2015-09-24 19:20:00
【问题描述】:

我有类似的地图

Map<String,Integer> mp = new TreeMap<>();
        mp.put("R1", 00);
        mp.put("R0", 11);
        mp.put("R2", 22);
        mp.put("R3", 33);
        mp.put("R5", 55);
        mp.put("R8", 88);
        mp.put("R4", 44);
        mp.put("R6", 66);
        mp.put("R9", 99);
        mp.put("R7", 77);
        mp.put("R11", 1111);
        mp.put("R14", 1414);
        mp.put("R10", 1010);
        mp.put("R12", 1212);
        mp.put("R13", 1313);
        mp.put("R15", 1515);
        mp.put("R17", 1717);
        mp.put("R19", 1919);

我想根据键进行排序。由于字母数字,TreeMap 无法正常工作,正在获取输出

{R0=11, R1=0, R10=1010, R11=1111, R12=1212, R13=1313, R14=1414, R15=1515, R17=1717, R19=1919, R2=22, R3=33, R4=44, R5=55, R6=66, R7=77, R8=88, R9=99}

建议怎么做?

【问题讨论】:

  • 这是字符串的正常排序。如果您需要以不同的方式对它们进行排序,请使用 Comparator 以您需要的任何顺序比较字符串。
  • 您希望它们按什么顺序排列?
  • 我想要这样的订单:{R0=11, R1=0, R2=22, R3=33, R4=44..}
  • R[number]形式的所有键还是A[number]BB[number]这样的键?
  • All in R[Number] only.

标签: java hashmap treemap


【解决方案1】:

创建并传递给您的 TreeMap 比较器,它将仅比较键中的整数部分(假设所有键的形式为 R[number])。

在 Java 8 中,您的地图可能看起来像

Map<String, Integer> mp = new TreeMap<>(
        Comparator.comparingInt(key -> Integer.parseInt(key.substring(1))));

在 Java 7 中,您可以将其重写为

Map<String, Integer> mp = new TreeMap<>(new Comparator<String>(){
    @Override
    public int compare(String key1, String key2) {
               //parse only text after first letter
        int k1 = Integer.parseInt(key1.substring(1));
        int k2 = Integer.parseInt(key2.substring(1));
        return Integer.compare(k1, k2);
    }
});

它将以某种方式对元素进行排序:

{R0=11, R1=0, R2=22, R3=33, R4=44, R5=55, R6=66, R7=77, R8=88, R9=99, R10=1010, R11=1111, R12=1212, R13=1313, R14=1414, R15=1515, R17=1717, R19=1919}

【讨论】:

  • @TanuGarg 我更新了我的答案以添加 Java 7 解决方案。
  • 你有一些导入问题。感谢您的快速支持。
  • 注意这个解决方案需要在treeMap的构造函数上设置比较器,然后你必须设置map的值
【解决方案2】:

您可以从Map 创建Entry 对象的Set。然后将自定义ComparatorSet 一起传递给Collections.sort()。我已经给出了下面的模板。

Set<Entry<String, Integer>> set = map.entrySet();
List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set);
Collections.sort( list, new Comparator<Map.Entry<String, Integer>>()
{
  public int compare( Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2 )
  {
    // Put your logic here for sorting.
  }
} );

您可以使用String 中的regexsubstring 方法将字符和数字与String 分开。

【讨论】:

    猜你喜欢
    • 2017-04-10
    • 1970-01-01
    • 2011-02-06
    • 2016-08-25
    • 2013-07-27
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多