如何在地图上交换密钥?

问题描述:

有没有办法对存储在字符串变量中的这些数字进行排序?如何在地图上交换密钥?

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 :)谢谢:)

地图中的键不IntegerString值。这就是为什么键被按照观察排序的原因。

要么改变地图

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); 
    } 
}); 
+0

是的,这是字符串。有没有办法如何对这些键进行排序?其中他们在哪里数字字符串变量。:) – 2011-01-06 08:28:40

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”。我强烈建议使用这种方法,或至少有一个喜欢它。类型系统是你的朋友。