Java 如何使用SimpleEntry编写自定义比较器对树集进行排序?
我目前正在处理一个赋值,它要求我使用树集对值对进行排序。我被要求使用SimpleEntry。我将它们存储在树集上:Java 如何使用SimpleEntry编写自定义比较器对树集进行排序?,java,tree,comparator,Java,Tree,Comparator,我目前正在处理一个赋值,它要求我使用树集对值对进行排序。我被要求使用SimpleEntry。我将它们存储在树集上: TreeSet TreeSet=newtreeset(new PairComparator()); SimpleEntry对=新SimpleEntry(重量、来源); 树集。添加(对); 这是我的自定义比较器: 静态类PairComparator实现Comparator{ @凌驾 公共int比较(AbstractMap.SimpleEntry o1,AbstractMap.Sim
TreeSet TreeSet=newtreeset(new PairComparator());
SimpleEntry对=新SimpleEntry(重量、来源);
树集。添加(对);
这是我的自定义比较器:
静态类PairComparator实现Comparator{
@凌驾
公共int比较(AbstractMap.SimpleEntry o1,AbstractMap.SimpleEntry o2){
int key1=o1.getKey();
int key2=o2.getKey();
返回键1-键2;
}
}
我得到一个我不理解的错误,即:
类java.util.HashMap不能强制转换为类java.lang.Integer
你能解释一下发生了什么事吗?我并不完全熟悉自定义比较器的定义
Comparator<AbstractMap.SimpleEntry<Integer,Integer>> pairComparator =
(se1,se2)-> Integer.compare(se1.getKey(),se2.getKey());
谢谢你的关注
编辑:我在SimpleEntry上添加了一个Hashmap作为一个键,而不是一个整数,这一点现在很明显…似乎不知何故,您已将Hashmap作为键添加到树集中的一个SimpleEntry中 请展示一个完整的可运行示例 此代码适用于我:
import java.util.AbstractMap;
import java.util.AbstractMap.SimpleEntry;
import java.util.Comparator;
import java.util.TreeSet;
public class Main {
static class PairComparator implements Comparator<SimpleEntry<Integer, Integer>> {
@Override
public int compare(SimpleEntry<Integer, Integer> o1, SimpleEntry<Integer, Integer> o2) {
int key1 = o1.getKey();
int key2 = o2.getKey();
return key1 - key2;
}
}
public static void main(String[] args) {
TreeSet treeSet = new TreeSet(new PairComparator());
treeSet.add(new SimpleEntry(42, 69));
treeSet.add(new SimpleEntry(37, 65));
treeSet.add(new SimpleEntry(23, 19));
treeSet.add(new SimpleEntry(54, 12));
System.out.println(treeSet);
}
}
import java.util.AbstractMap;
导入java.util.AbstractMap.SimpleEntry;
导入java.util.Comparator;
导入java.util.TreeSet;
公共班机{
静态类PairComparator实现Comparator{
@凌驾
公共整数比较(SimpleEntry o1,SimpleEntry o2){
int key1=o1.getKey();
int key2=o2.getKey();
返回键1-键2;
}
}
公共静态void main(字符串[]args){
TreeSet TreeSet=新树集(new PairComparator());
添加(新的SimpleEntry(42,69));
添加(新的单纯形(37,65));
添加(新的SimpleEntry(23,19));
添加(新的简单尝试(54,12));
系统输出打印LN(树集);
}
}
似乎不知何故,您添加了一个HashMap作为树集中某个SimpleEntry的键
请展示一个完整的可运行示例
此代码适用于我:
import java.util.AbstractMap;
import java.util.AbstractMap.SimpleEntry;
import java.util.Comparator;
import java.util.TreeSet;
public class Main {
static class PairComparator implements Comparator<SimpleEntry<Integer, Integer>> {
@Override
public int compare(SimpleEntry<Integer, Integer> o1, SimpleEntry<Integer, Integer> o2) {
int key1 = o1.getKey();
int key2 = o2.getKey();
return key1 - key2;
}
}
public static void main(String[] args) {
TreeSet treeSet = new TreeSet(new PairComparator());
treeSet.add(new SimpleEntry(42, 69));
treeSet.add(new SimpleEntry(37, 65));
treeSet.add(new SimpleEntry(23, 19));
treeSet.add(new SimpleEntry(54, 12));
System.out.println(treeSet);
}
}
import java.util.AbstractMap;
导入java.util.AbstractMap.SimpleEntry;
导入java.util.Comparator;
导入java.util.TreeSet;
公共班机{
静态类PairComparator实现Comparator{
@凌驾
公共整数比较(SimpleEntry o1,SimpleEntry o2){
int key1=o1.getKey();
int key2=o2.getKey();
返回键1-键2;
}
}
公共静态void main(字符串[]args){
TreeSet TreeSet=新树集(new PairComparator());
添加(新的SimpleEntry(42,69));
添加(新的单纯形(37,65));
添加(新的SimpleEntry(23,19));
添加(新的简单尝试(54,12));
系统输出打印LN(树集);
}
}
您没有为树集
和其他一些数据结构指定类型,但我在这里指定了类型,并且工作正常。我确实换了你的比较仪。减去整数值来进行比较不是一个好主意,因为它可能会导致大数值出现问题
TreeSet<SimpleEntry<Integer, Integer>> treeSet =
new TreeSet<>(new PairComparator());
Random r = new Random(23);
for (int i = 0; i < 10; i++) {
int weight = r.nextInt(100);
int source = r.nextInt(100);
SimpleEntry<Integer, Integer> pair =
new SimpleEntry<>(weight, source);
treeSet.add(pair);
}
treeSet.forEach(System.out::println);
比较器
static class PairComparator implements
Comparator<AbstractMap.SimpleEntry<Integer, Integer>> {
public int compare(
AbstractMap.SimpleEntry<Integer, Integer> o1,
AbstractMap.SimpleEntry<Integer, Integer> o2) {
int key1 = o1.getKey();
int key2 = o2.getKey();
return key1 < key2 ? -1 : key1 > key2 ? 1 : 0;
}
}
静态类PairComparator实现
比较器{
公共整数比较(
AbstractMap.SimpleEntry o1,
AbstractMap.SimpleEntry o2){
int key1=o1.getKey();
int key2=o2.getKey();
返回键1key2-1:0;
}
}
您还可以指定以下内容作为比较器
Comparator<AbstractMap.SimpleEntry<Integer,Integer>> pairComparator =
(se1,se2)-> Integer.compare(se1.getKey(),se2.getKey());
比较器对比较器=
(se1,se2)->Integer.compare(se1.getKey(),se2.getKey());
您没有为树集
和其他一些数据结构指定类型,但我在这里指定了类型,并且工作正常。我确实换了你的比较仪。减去整数值来进行比较不是一个好主意,因为它可能会导致大数值出现问题
TreeSet<SimpleEntry<Integer, Integer>> treeSet =
new TreeSet<>(new PairComparator());
Random r = new Random(23);
for (int i = 0; i < 10; i++) {
int weight = r.nextInt(100);
int source = r.nextInt(100);
SimpleEntry<Integer, Integer> pair =
new SimpleEntry<>(weight, source);
treeSet.add(pair);
}
treeSet.forEach(System.out::println);
比较器
static class PairComparator implements
Comparator<AbstractMap.SimpleEntry<Integer, Integer>> {
public int compare(
AbstractMap.SimpleEntry<Integer, Integer> o1,
AbstractMap.SimpleEntry<Integer, Integer> o2) {
int key1 = o1.getKey();
int key2 = o2.getKey();
return key1 < key2 ? -1 : key1 > key2 ? 1 : 0;
}
}
静态类PairComparator实现
比较器{
公共整数比较(
AbstractMap.SimpleEntry o1,
AbstractMap.SimpleEntry o2){
int key1=o1.getKey();
int key2=o2.getKey();
返回键1key2-1:0;
}
}
您还可以指定以下内容作为比较器
Comparator<AbstractMap.SimpleEntry<Integer,Integer>> pairComparator =
(se1,se2)-> Integer.compare(se1.getKey(),se2.getKey());
比较器对比较器=
(se1,se2)->Integer.compare(se1.getKey(),se2.getKey());
你说得对,我打错了。我确实把它加在我的树上了。此代码是使用Treeset实现Dijkstra算法的一部分。代码与此代码有些类似:。但是我没有使用Pair,而是尝试使用SimpleEntry。SimpleMap的关键是边的权重,值是源顶点的索引。下面是错误代码:线程“main”java.lang.ClassCastException中的异常:无法将类java.util.HashMap转换为类java.lang.Integer(java.util.HashMap和java.lang.Integer位于加载程序“bootstrap”的模块java.base中)
@Winver我运行该示例时没有任何问题。我正在使用JDK15。我添加了导入以澄清正在使用的类。在我的代码中没有使用HashMap。您是否按原样运行了我的示例?我发现了错误,我没有在SimpleEntry键上添加整数。。。我觉得犯这个错误太愚蠢了。我添加了一个Hashmap,而不是从给定的键中获取值,这正是您所说的。。。谢谢你的回答!你的代码完全有效,因为我尝试了另一个文件。一切都好!你说得对,我打错了。我确实把它加在我的树上了。此代码是使用Treeset实现Dijkstra算法的一部分。代码与此代码有些类似:。但是我没有使用Pair,而是尝试使用SimpleEntry。SimpleMap的关键是边的权重,值是