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);
}
});
ATreeMap
可以使用自定义比较器进行自定义排序。编写一个比较器,按照您想要的方式对键进行排序,并在创建树映射时使用它
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;
}
}