如何在地图中交换密钥?

时间:2011-01-06 08:22:50

标签: java list sorting map tree

有没有办法对存储在字符串变量中的数字进行排序?

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

3 个答案:

答案 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);