Java 如何在地图中交换密钥?

Java 如何在地图中交换密钥?,java,list,sorting,map,tree,Java,List,Sorting,Map,Tree,有没有办法对存储在字符串变量中的数字进行排序 TreeMap qbElementMap=newtreemap() 这是关键点所在的地图: 27525-1813, 27525-3989, 27525-4083, 27525-4670, 27525-4911, 27526-558, 27526-1303, 27526-3641, 27526-4102, 27527-683, 27527-2411, 27527-4342 这是键列表,每个键的值都是一个列表。 现在,我如何按数字升

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

TreeMap qbElementMap=newtreemap()

这是关键点所在的地图:

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
我想要的as输出是:1,2,3,10,11,20,31
但是当我使用树映射的自动排序时,输出是:1,10,11,2,20,3,31

如何按数字升序排序


语言是java:)谢谢:)

地图中的键不是
整数
,而是
字符串
值。这就是为什么键会像观察到的那样排序

或者将地图更改为

TreeMap<Long,List<QBFElement>> qbfElementMap
Comparator
的实现可以使用相同的映射来创建两个基于字符串的键的数字比较:

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);
  }
});
newtreemap(newcomparator(){
@凌驾
公共整数比较(字符串键1、字符串键2){
字符串[]parts1=key1.split(“”);
Long long1=Long.parseLong(parts1[0])*10000+Long.parseLong(parts1[1]);
字符串[]parts2=key2.split(“”);
Long-long2=Long.parseLong(parts2[0])*10000+Long.parseLong(parts2[1]);
返回long1.compareTo(long2);
}
});

A
TreeMap
可以使用自定义比较器进行自定义排序。编写一个比较器,按照您想要的方式对键进行排序,并在创建树映射时使用它

TreeMap<String,List<QBFElement>> qbfElementMap = new TreeMap<String, List<QBFElement>>(myComparator);
TreeMap qbElementMap=新的TreeMap(MyComperator);

您可以通过向构造函数提供自定义比较器来更改
树映射对其键进行排序的方式。如果需要,可以定义一个新的
比较器
,该比较器通过将字符串分解为数字分量来比较字符串

不过,最好不要使用
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;
    }
}
public类KeyType实现了可比较的{
私人最终int优先;
二等兵;
公钥类型(int-first,int-second){
this.first=first;
这个秒=秒;
}
@凌驾
公共布尔等于(对象其他){
如果(!(KeyType的其他实例))返回false;
KeyType realOther=(KeyType)other;
返回realOther.first==first&&realOther.second==second;
}
@凌驾
公共int hashCode(){
第一次返回+31*秒;
}
公共整数比较(键类型其他){
if(first!=其他.first)
先返回-其他。先返回;
返回秒-other.second;
}
}

这种方法最具表现力和健壮性。它使您能够更好地访问正在使用的键的各个字段,还可以防止向地图中添加像字符串“lala”这样的无意义键。我强烈建议使用这种方法,或者至少有一种类似的方法。类型系统是您的朋友。

是的,这是字符串。有没有办法把这些钥匙分类?其中,数字在字符串变量中的位置:)
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;
    }
}