如何在地图上交换密钥?
有没有办法对存储在字符串变量中的这些数字进行排序?如何在地图上交换密钥?
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
这是密钥的列表,并为每个键的值被列表。
现在,我怎么能按照数字升序排序这个键。
ex。如果我想要排序:1,2,11,20,31,3,10
我想输出为:1,2,3,10,11,20,31
但是当我使用自动排序的输出结果如下:1,10,11,2,20,3,31
我该如何按数值对它进行升序排序?
和语言是Java :)谢谢:)
地图中的键不Integer
但String
值。这就是为什么键被按照观察排序的原因。
要么改变地图
TreeMap<Long,List<QBFElement>> qbfElementMap
或用专门的Comparator
,将提供预期的数字顺序为String
类型键创建它。
从您的字符串值,以多头的映射可以做这样的:
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);
}
});
A TreeMap
可以采用自定义比较器进行自定义排序。编写排序键你想要的方式,当你创建的映像树
TreeMap<String,List<QBFElement>> qbfElementMap = new TreeMap<String, List<QBFElement>>(myComparator);
你可以改变的方式是,通过TreeMap
提供自定义比较器来构造其排序键使用它的比较器。如果需要,可以定义一个新的Comparator
,将字符串拆分为数字组件。
这似乎是一个更好的主意,但是,将不使用String
s作为您的钥匙。您用作键的数据显然不是文本的 - 它是数字 - 您可能需要定义一个自定义类型来表示它。例如:
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”。我强烈建议使用这种方法,或至少有一个喜欢它。类型系统是你的朋友。
是的,这是字符串。有没有办法如何对这些键进行排序?其中他们在哪里数字字符串变量。:) – 2011-01-06 08:28:40