【问题标题】:Java sorting map<String,String> by String prefixJava 按字符串前缀对 map<String,String> 进行排序
【发布时间】:2013-06-22 09:36:00
【问题描述】:

在 Java 中。 如何按给定的带有数字前缀的字符串对地图进行排序。 我从属性文件中获取地图:

1_aaa=bla1
2_bbb=bla2
3_ccc=bla3
4_ddd=bla4 
...
10_jjj=bla10
11_kkk=bla11
12_lll=bla12

我正在从文件加载属性:

FileInputStream is =new FileInputStream(new File(filePath));
Properties prop = new Properties();
prop.load(is);

之后: SortedMap&lt;Object, Object&gt; sortedProperties new TreeMap&lt;Object, Object&gt;(prop);

现在使用 TreeMap 时 --> '10_jjj' 是 SortedMap 中的第一个元素 我希望 '1_aaa' 成为第一个。

有什么想法吗?

谢谢

【问题讨论】:

    标签: java list sorting map treemap


    【解决方案1】:

    这应该可以满足您的需要

        Properties p = new Properties();
        p.setProperty("1_aaa", "blah");
        p.setProperty("10_aaa", "blah");
    
        Comparator<Object> c = new Comparator<Object>()
        {
            @Override
            public int compare(Object o1, Object o2)
            {
                String s1 = (String)o1;
                String s2 = (String)o2;
    
                Integer i1 = Integer.valueOf(s1.substring(0, s1.indexOf('_')));
                Integer i2 = Integer.valueOf(s2.substring(0, s2.indexOf('_')));
    
                return i1.compareTo(i2);
            }
        };
    
        SortedMap<Object, Object> sortedProperties = new TreeMap<Object, Object>(c);
        sortedProperties.putAll(p);
    
        System.out.println(sortedProperties.firstKey());
    

    【讨论】:

      【解决方案2】:

      这是工作代码:

      class ComparatorOfNumericString implements Comparator<String>{
      
          public int compare(String o1, String o2) {
              // TODO Auto-generated method stub
              String a[] = o1.split("_");
              String b[] = o2.split("_");
              return Integer.parseInt(a[0])-Integer.parseInt(b[0]);
          }
      }
      

      【讨论】:

      • 你是一个救生员。谢谢。
      【解决方案3】:

      这种行为是因为0 comes before _ in the ASCII table

      要得到你想要的,写你的Comparator&lt;String&gt;并根据前缀比较字符串,然后使用TreeMap(Comparator)构造函数来构造地图。

      没有任何错误检查等的简单示例:

      class Cmp implements Comparator<String> {
          @Override
          public int compare(String a, String b) {
              return prefixNum(a) - prefixNum(b);
          }
      
          private int prefixNum(String a) {
              return Integer.parseInt(a.split("_")[0]);
          }
      }
      

      然后像这样实例化地图:

      TreeMap<String, String> map = new TreeMap<String, String>(new Cmp());
      

      【讨论】:

      • 你是一个救生员。谢谢。
      【解决方案4】:

      您需要将前缀转换为整数,然后对它们进行排序,例如

      int prefix = Integer.parseInt(str.substring(0, str.indexOf("_"))); // sort/compare on this
      

      【讨论】:

        【解决方案5】:

        您必须创建自己的Comparator 才能完成此操作。

        在创建TreeMap 期间,您可以将此Comparator 提供给Map,然后按照您实现它的方式对其进行排序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-31
          • 2015-07-16
          • 1970-01-01
          • 1970-01-01
          • 2019-12-04
          相关资源
          最近更新 更多