3

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

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<Object, Object> sortedProperties new TreeMap<Object, Object>(prop);

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

有任何想法吗?

谢谢

4

5 回答 5

6

该行为是因为0出现_在 ASCII 表中

为了得到你想要的,写你的Comparator<String>并根据前缀比较字符串,然后使用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());
于 2013-06-25T14:23:06.057 回答
2

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

在创建过程中,TreeMap您可以将其提供给ComparatorMap然后按照您实现它的方式对其进行排序。

于 2013-06-25T14:23:28.123 回答
0

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

int prefix = Integer.parseInt(str.substring(0, str.indexOf("_"))); // sort/compare on this
于 2013-06-25T14:24:15.400 回答
0

这是工作代码:

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]);
    }
}
于 2013-06-25T14:34:41.987 回答
0

这应该做你需要的

    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());
于 2013-06-25T14:42:25.317 回答