Java 树映射值比较器
当使用treemap比较器时,若两个键的值相同,比较器只考虑第一个值而忽略第二个值 例如:未排序的映射->{2=93085,1=93254,4=92928,9=93164,8=93085} 我编写的代码的实际结果:{1=93254,9=93164,8=93085,4=92928} 我需要这样的输出-->{1=93254,9=93164,8=93085,2=93085,4=92928}Java 树映射值比较器,java,sorting,hashmap,comparator,treemap,Java,Sorting,Hashmap,Comparator,Treemap,当使用treemap比较器时,若两个键的值相同,比较器只考虑第一个值而忽略第二个值 例如:未排序的映射->{2=93085,1=93254,4=92928,9=93164,8=93085} 我编写的代码的实际结果:{1=93254,9=93164,8=93085,4=92928} 我需要这样的输出-->{1=93254,9=93164,8=93085,2=93085,4=92928} 因为键2和键8有相同的值(93085),所以我只得到一个。请有人帮忙。当比较器将键报告为相等时,将键视为相等是树
因为键2和键8有相同的值(93085),所以我只得到一个。请有人帮忙。当比较器将键报告为相等时,将键视为相等是
树映射的一个属性(并且贴图通常不支持多个相等键)
正如上面所说:
…排序映射使用其compareTo
(或compare
)方法执行所有键比较,因此,从排序映射的角度来看,此方法认为相等的两个键是相等的
如果要防止键之间没有排序时消失,则必须添加二级排序,以便在主排序认为键相等时使用。由于地图首先具有可比较的关键点,因此可以利用它们的自然顺序来获得所需的结果:
package com.example.admin.app;
import java.util.Comparator;
import java.util.Map;
class MyComparator implements Comparator {
Map map;
public MyComparator(Map map){
this.map = map;
}
public int compare (Object o1, Object o2) {
return ((Long) map.get(o2)).compareTo((Long) map.get(o1));
}
}
这两种方法都会生成具有所需迭代顺序的映射。哪一种更合适取决于随后如何使用
由于对列表进行排序并不能消除重复项,因此它也可以与初始比较器一起工作,尽管我会使其类型安全:
List<Integer> list = new ArrayList<>(result.keySet());
Collections.sort(list, new MyComparator(result));
Map<Integer, Long> newMap = new LinkedHashMap<>();
for(Integer i: list) newMap.put(i, result.get(i));
System.out.println("new map ---> " + newMap);
类MyComparator实现比较器{
final Map你是什么意思我只得到一个你能显示代码吗?欢迎来到stackoverflow!为了让我们帮助你,你能发布你正在使用的比较器代码吗?显示你的代码。树映射使用的比较器比较键,而不是值。你的代码中一定有其他原因导致这种情况问题。@JacobG。我认为如果比较器返回0,树映射会将其解释为相同的键值,并用新的键值替换以前的值
class MyComparator implements Comparator<Integer> {
final Map<Integer, Long> map;
public MyComparator(Map<Integer, Long> map){
this.map = map;
}
public int compare(Integer o1, Integer o2) {
int c = Long.compare(map.get(o2), map.get(o1));
return c != 0? c: o2.compareTo(o1);
}
}
Map<Integer, Long> result = new HashMap<>();
result.put(2, 93085L);
result.put(1, 93254L);
result.put(4, 92928L);
result.put(9, 93164L);
result.put(8, 93085L);
SortedMap<Integer, Long> newMap = new TreeMap<>(new MyComparator(result));
newMap.putAll(result);
// new map ---> {1=93254, 9=93164, 8=93085, 2=93085, 4=92928}
System.out.println("new map ---> " + newMap);
List<Integer> list = new ArrayList<>(result.keySet());
Collections.sort(list, new MyComparator(result));
Map<Integer, Long> newMap = new LinkedHashMap<>();
for(Integer i: list) newMap.put(i, result.get(i));
System.out.println("new map ---> " + newMap);
class MyComparator implements Comparator<Integer> {
final Map<?, Long> map;
public MyComparator(Map<?, Long> map){
this.map = map;
}
public int compare(Integer o1, Integer o2) {
return Long.compare(map.get(o2), map.get(o1));
}
}