Tag: 比较器

实现Java Comparator

我正在尝试编写一个利用最小优先级队列的算法,所以我环顾谷歌并找到了PriorityQueue。 看来,为了使用它,我需要告诉它我希望它如何优先排序,并且这样做的方法是使用比较器(我想比较我的“Node1”的特定数据字段)对象)。 更多的谷歌搜索提出了创建一个新的比较器的想法,该比较器实现了比较器但覆盖了比较方法。 我正在尝试的是这个(以及它的其他变体): import java.util.Comparator; public class distComparator implements Comparator { @Override public int compare(Node1 x, Node1 y){ if(x.disty.dist){ return 1; } return 0; } } 编译器有几个理由抗议,其中一个原因是我没有超越比较器类(它说它是抽象的) 错误:distComparator不是抽象的,并且不会覆盖Comparator中的抽象方法compare(Object,Object) 我已将其切换为“比较(对象x,对象y)”,它负责处理该问题。 此时虽然编译器抱怨它无法在x或y中找到“dist”变量 – 这是有道理的,因为它们是我的Node1类的一部分,而不是Object类。 那怎么能起作用呢? 它显然应该有Object类型,但是如何将它引导到正确的变量?

使用自定义Comparator在Java中创建SortedMap

我想用Java自定义排序顺序创建一个TreeMap 。 作为字符串的排序键需要根据第二个字符进行排序。 值也是字符串。 示例地图: Za,FOO Ab,Bar

Comparator.comparing(…)嵌套字段

假设我有一个这样的域模型: class Lecture { Course course; … // getters } class Course { Teacher teacher; int studentSize; … // getters } class Teacher { int age; … // getters } 现在我可以像这样创建一个教师比较器: return Comparator .comparing(Teacher::getAge); 但是如何比较Lecture在嵌套字段上的比例呢? return Comparator .comparing(Lecture::getCourse::getTeacher:getAge) .thenComparing(Lecture::getCourse::getStudentSize); 我无法在模型上添加方法Lecture.getTeacherAge() 。

Java:SortedMap,TreeMap,Comparable? 如何使用?

我有一个对象列表,我需要根据其中一个字段的属性进行排序。 我听说SortedMap和Comparators是最好的方法。 我是否正在对我正在排序的类实现Comparable,还是创建一个新类? 如何实例化SortedMap并传入Comparator? 排序如何工作? 它会在插入新对象时自动对所有内容进行排序吗? 编辑:此代码给我一个错误: private TreeMap collection = new TreeMap(); (Ktr实现Comparator )。 Eclipse说它期待类似TreeMap ,所以我提供的参数数量不正确。

Java 8 Comparator nullsFirst naturalOrder困惑

这可能是一个简单的问题,但我想清楚地理解它…… 我有这样的代码: public final class Persona { private final int id; private final String name public Persona(final int id,final String name) { this.id = id; this.name = name; } public int getId(){return id;} public String getName(){return name;} @Override public String toString(){return “Persona{” + “id=” + id + “, name=” + name+’}’;} } 我正在测试这段代码: import static […]

为什么Java Collections Framework提供了两种不同的排序方式?

如果我有一个我想要排序的元素列表,Java提供了两种方法来解决这个问题。 例如,假设我有一个Movie对象列表,我想按标题对它们进行排序。 我可以这样做的一种方法是调用静态java.util.Collections.sort()方法的单参数版本,并将我的电影列表作为单个参数。 所以我会调用Collections.sort(myMovieList)。 为了使其工作,必须声明Movie类以实现java.lang.Comparable接口,并且必须在此类中实现所需的方法compareTo()。 另一种排序方法是使用影片列表和java.util.Comparator对象作为参数调用静态java.util.Collections.sort()方法的双参数版本。 我会调用Collections.sort(myMovieList,titleComparator)。 在这种情况下,Movie类不会实现Comparable接口。 相反,在构建和维护影片列表本身的主类中,我将创建一个实现java.util.Comparator接口的内部类,并实现一个必需的方法compare()。 然后我将创建此类的实例并调用sort()的双参数版本。 第二种方法的好处是您可以创建无限数量的这些内部类比较器,因此您可以以不同的方式对对象列表进行排序。 在上面的示例中,您可以让另一个Comparator按照制作电影的年份进行排序。 我的问题是,为什么麻烦学习两种方式在Java中进行排序,当Collections.sort()的双参数版本执行第一个单参数版本所做的所有事情时,还有一个额外的好处就是能够对列表的元素进行排序根据几个不同的标准? 在编码时必须记住这一点。 你有一个基本的机制来排序Java中的列表来了解。

如何使用Comparator对ArrayList进行排序?

我有一个实现静态方法的类学生 public static Comparator getCompByName() 返回Student的新比较器对象,通过属性“name”比较2个Students对象。 我现在需要使用我的函数getCompByName()通过’name’对学生ArrayList进行排序来测试它。 这是我的Student课程中的Comparator方法。 public static Comparator getCompByName() { Comparator comp = new Comparator(){ @Override public int compare(Student s1, Student s2) { return s1.name.compareTo(s2.name); } }; return comp; } 而主要我需要测试的地方 public static void main(String[] args) { // TODO code application logic here //——–Student Class Test——————————————- ArrayList students = new ArrayList(); Student […]

Javagenerics:Collections.max()签名和Comparator

我理解集合的get和put原则 :如果一个方法接受一个集合,它会写一个类型T,参数必须是Collection Collection ,而如果它将从中读取类型T,则参数必须为Collection Collection 。 但有人可以解释Collections.max()签名: public static T max(Collection coll, Comparator comp) 特别是为什么Comparator Comparator代替Comparator Comparator ?

在Java 8中反转比较器

我有一个ArrayList,并希望按降序排序。 我用它来java.util.stream.Stream.sorted(Comparator)方法。 这是根据Java API的描述: 返回由此流的元素组成的流,根据提供的Comparator进行排序。 这个方法按升序返回给我。 我应该更改哪个参数,只是为了降序?

在Java中使用Comparable实现VO的多个动态字段

我上课了 public class StudentVO { int age; String name; } 我在两个不同的领域使用了同一个class级。 在一个地方,我需要根据年龄排序。 在另一个地方,我需要根据名称进行排序,在另一个地方,我可能需要根据年龄和名称进行排序。 我怎样才能做到这一点? 如果一个字段我可以覆盖compareTo() 。 是否有可能做到这一点?