【问题标题】:Sort a Java TreeSet using Comparator使用 Comparator 对 Java TreeSet 进行排序
【发布时间】:2019-04-07 17:53:34
【问题描述】:

我正在尝试使用Comparator 接口对对象(“学生”)的TreeSet 进行排序。这是Comparator 的实现:

import java.util.Comparator;


public class TriParNom implements Comparator<Etudiant>{
    public int compare(Etudiant o1, Etudiant o2) {
        return o1.getNom().compareTo(o2.getNom());
    }
}

这里是 TreeSet 声明和 main 中比较器的调用:

TreeSet<Etudiant> University= new TreeSet<Etudiant>(new TriParNom());

当我声明 TreeSet 并调用比较器时,我在主类中遇到的错误是:没有找到适合 TreeSet(TriParNom) 的构造函数。

请问有什么解决办法吗?提前致谢。

【问题讨论】:

  • 您能否将您的导入语句添加到问题中。我假设您使用的是不同的 TreeSet 或 Comparator。
  • 导入 java.util.Collections;导入 java.util.HashSet;导入 java.util.Set;导入 java.util.SortedSet;导入 java.util.TreeSet;
  • TriParNom 的导入?
  • @k5 TriParNom 是同一个包中的一个类,所以不需要导入!
  • 发布一个完整的最小示例来重现该问题。我们必须能够复制您发布的代码,将其粘贴到我们的 IDE 中而不进行任何修改,然后查看问题重现。

标签: java sorting set comparator treeset


【解决方案1】:

我根据你提供的信息尝试了一个非常简单的实现,我给你我的结果:

Etudiant 类是一个非常简单的 pojo

public class Etudiant {

private String nom;

public String getNom() {
    return nom;
}

public void setNom(String nom) {
    this.nom = nom;
}   }

TriParNom 类是您描述的普通 Comparator:

import java.util.Comparator;

public class TriParNom implements Comparator<Etudiant> {

    @Override
    public int compare(Etudiant o1, Etudiant o2) {
        return o1.getNom().compareTo(o2.getNom());
    }

}

这是一个简单的类,带有一个入口点和一个示例方法来练习新创建的树集

import java.util.TreeSet;

public class Main {

    public static void main(String[] args) {
        TreeSet<Etudiant> u = new TreeSet<>(new TriParNom());
        System.out.printf("size? %d%n", u.size());      
    }

}

执行结果如下:

显然也没有编译错误。

【讨论】:

    【解决方案2】:

    如果您的代码与下面给出的 sn-p 匹配,那么它应该可以正常运行而不会出现问题。从class TriParNom 中删除implements Comparator&lt;Etudiant&gt; 部分的那一刻,您将收到指示未找到合适的构造函数的错误。现在,如果您在实现TriParNom 的比较器之后没有重新编译您的类,则可能会发生另一种愚蠢的方式 - 但这太明显了。是否将您的延续 main 方法(声明 Treeset)的类导入 java.util.TreeSet

    import java.util.Comparator;
    import java.util.TreeSet;
    
    public class TreesetCheck {
        public static void main(String[] args) {
            TreeSet<Etudiant> University= new TreeSet<Etudiant>(new TriParNom());
        }
    }
    
    class TriParNom implements Comparator<Etudiant>{
        public int compare(Etudiant o1, Etudiant o2) {
            return o1.getNom().compareTo(o2.getNom());
        }
    }
    
    class Etudiant {
        public String getNom() {
            // TODO Auto-generated method stub
            return "some";
        }
    }
    

    【讨论】:

    • 我得到的错误是当我在 main 中声明树集并在参数中给它比较器!其他类没有其他错误
    • 你使用IDE编译和运行它吗?
    • 要么你没有实现TriParNom的比较器,要么在你实现比较器后它没有被重新编译(手动或通过IDE)。因为当类没有比较器javac com/TreesetCheck.javacom/TreesetCheck.java:8: error: no suitable constructor found for TreeSet(TriParNom) 时,你得到的错误就会出现
    猜你喜欢
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    相关资源
    最近更新 更多