Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用SimpleEntry编写自定义比较器对树集进行排序?_Java_Tree_Comparator - Fatal编程技术网

Java 如何使用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

我目前正在处理一个赋值,它要求我使用树集对值对进行排序。我被要求使用SimpleEntry。我将它们存储在树集上:

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的关键是边的权重,值是