Java 树映射值比较器

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),所以我只得到一个。请有人帮忙。当比较器将键报告为相等时,将键视为相等是树

当使用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),所以我只得到一个。请有人帮忙。

当比较器将键报告为相等时,将键视为相等是
树映射的一个属性(并且贴图通常不支持多个相等键)

正如上面所说:

…排序映射使用其
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));
    }
}