按字符串前缀对Java的map<String,String>进行排序

3

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

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'成为第一个。

有什么想法吗?

谢谢。

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());

2

您需要创建自己的Comparator来实现这一点。

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


0

你需要将前缀转换为整数,然后按照它们进行排序,例如:

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

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]);
    }
}

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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接