有没有办法对存储在字符串变量中的数字进行排序?
TreeMap<String,List<QBFElement>> qbfElementMap = new TreeMap<String, List<QBFElement>>();
这是密钥所在的地图:
27525-1813,
27525-3989,
27525-4083,
27525-4670,
27525-4911,
27526-558,
27526-1303,
27526-3641,
27526-4102,
27527-683,
27527-2411,
27527-4342
这是键列表,每个键的值是一个列表 现在,我如何按编号按升序对此键进行排序。
离。如果我想排序:1,2,11,20,31,3,10
我想输出的是:1,2,3,10,11,20,31
但是当我使用treemap的autosort输出时:1,10,11,2,20,3,31
我怎样才能按数字升序排序?
,语言是java :)谢谢:)
答案 0 :(得分:2)
地图中的键不是Integer
,而是String
值。这就是为什么键的分类就像观察到的那样。
将地图更改为
TreeMap<Long,List<QBFElement>> qbfElementMap
或使用专门的Comparator
创建,它将为String
类型键提供预期的数字顺序。
从String值到Longs的映射可以这样完成:
private Long convertToLongTypeKey(String key) {
String[] parts = key.split("-");
// next lines assumes, that the second part is in range 0...9999
return Long.parseLong(parts[0]) * 10000 + Long.parseLong(parts[1]);
}
Comparator<String>
的实现可以使用相同的映射来创建两个基于String的键的数值比较:
new TreeMap<String,List<QBFElement>>(new Comparator<String>(){
@Override
public int compare(String key1, String key2) {
String[] parts1 = key1.split("-");
Long long1 = Long.parseLong(parts1[0]) * 10000 + Long.parseLong(parts1[1]);
String[] parts2 = key2.split("-");
Long long2 = Long.parseLong(parts2[0]) * 10000 + Long.parseLong(parts2[1]);
return long1.compareTo(long2);
}
});
答案 1 :(得分:1)
您可以通过为构造函数提供自定义比较器来更改TreeMap
对其键进行排序的方式。如果需要,您可以定义一个新的Comparator
,通过将字符串分解为数字组件来比较字符串。
但是,似乎更好的想法是不使用String
作为密钥。您用作密钥的数据显然不是文本的 - 它是数字的 - 您可能希望定义一个自定义类型来表示它。例如:
public class KeyType implements Comparable<KeyType> {
private final int first;
private final int second;
public KeyType(int first, int second) {
this.first = first;
this.second = second;
}
@Override
public boolean equals(Object other) {
if (!(other instanceof KeyType)) return false;
KeyType realOther = (KeyType) other;
return realOther.first == first && realOther.second == second;
}
@Override
public int hashCode() {
return first + 31 * second;
}
public int compareTo(KeyType other) {
if (first != other.first)
return first - other.first;
return second - other.second;
}
}
这种方法最具表现力和稳健性。它使您可以更好地访问您正在使用的键的各个字段,还可以防止您将无意义的键添加到地图中,如字符串“Lalalalala”。我强烈建议使用这种方法,或者至少有一种方法。类型系统是你的朋友。
答案 2 :(得分:0)
TreeMap
可以使用自定义比较器进行自定义排序。编写一个比较器,按照您想要的方式对键进行排序,并在创建树形图时使用它
TreeMap<String,List<QBFElement>> qbfElementMap = new TreeMap<String, List<QBFElement>>(myComparator);