我知道这些接口用于对集合中的对象进行排序。但我怀疑这两者的真正区别。我读到的一个事实是,如果要比较两个对象而不使用当前对象,请使用Compariable(此)。
但我的问题是即使使用比较器,我们也会比较相同的对象类型。
这里真正的区别是什么。我很困惑。假设下面的例子,
class Person implements Comparable<Person> {
private String firstName;
private String lastName;
private int age;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int compareTo(Person anotherPerson){
int anotherPersonAge =anotherPerson.getAge();
return this.age - anotherPersonAge;
}
}
如果我使用比较器,我会让一个类实现比较器,而不是这个。年龄,它有人。年龄那么这里有什么不同呢?
public class LastNameComparator implements Comparator<Person> {
public int compare(Person person, Person anotherPerson) {
int age1 = person.getAge();
int age2 = anotherPerson.getAge();
return age1 - age2;
}
}
我不知道Collections.sort使用的内在逻辑。如果是,请证明上述观点。
我也相信不需要返回-1,1或0对。上面的实现也是有效的,对吗?我遇到的一个问题是,如果我们返回1,列表如何按照升序或降序排列项目?我认为这是考虑到差异并根据差异排序。
以这种方式考虑。。。你有一个IntegerRapper类,它有一个整数,你在这个类中实现了Comparable。所以当使用集合对这些进行排序时。分类它将按升序为您提供对象。。。
但是,当您想更改此顺序并希望降序时,则必须实现比较器以按所需顺序对它们进行排序......
快速扫描java.util.集合javadocs提供了以下内容:
公共静态空排序(List list)-根据元素的自然顺序将指定列表按升序排序。列表中的所有元素都必须实现可比接口。此外,列表中的所有元素都必须相互可比(即e1.compareTo(e2)不得为列表中的任何元素e1和e2抛出ClassCastException)。
public static void sort(List List,Comparator c)-根据指定的Comparator诱导的顺序对指定的列表进行排序。列表中的所有元素必须使用指定的比较器相互比较(即,c.compare(e1,e2)不得对列表中的任何元素e1和e2抛出ClassCastException)。
可以推断,排序(列表列表)然后使用可比较接口,排序(列表列表,比较器c)使用比较器。
为了回答您的最后一个问题,以您描述的方式使用这两种方法没有区别......拥有这两种方法的目的是让您可以以不同的方式比较对象,而不是以使用不同实现的相同方式。
考虑两个可比的留档
该接口对实现它的每个类的对象强加一个总排序。这种排序称为类的自然排序,类的compareTo方法称为其自然比较方法。
和比较器
一种比较函数,它对某些对象集合施加总排序。比较器可以传递给排序方法(如Collections.sort或Arrays.sort),以允许精确控制排序顺序。比较器还可用于控制某些数据结构(如排序集或排序映射)的顺序,或为没有自然顺序的对象集合提供排序。
可比对象可以通过将自身与另一个对象进行比较(自然顺序)来确定其顺序,而比较器是一个知道如何比较两个对象并确定其特定顺序的对象。这里的区别在于谁负责比较。
自然排序使用compareTo
强加了一个定义的顺序,但是如果您想更改该顺序,或者更糟糕的是,没有定义的比较逻辑怎么办?这就是比较器
派上用场的地方,因为您可以根据不同的比较对集合进行排序,这些比较可以通过发出新的比较器
动态切换,而不是一些讨厌的逻辑,您应该告诉可比
对象“嘿,现在您根据名称而不是年龄排序”。
关于比较结果之间的差异,为每个对象检查它们。例如,以年龄为10
、15
和20
的三个人为例。15
与10
比较时返回1,但与20
比较时返回-1
,定义三人的顺序。
选择适合您需要的方法。如果您的比较逻辑是稳定的,并且将来不会更改,那么您可能希望拥有可比较的对象,但如果需要根据不同的标准对集合进行排序,则应选择Comparator。
问题内容: Comparable和Comparator之间的主要区别是什么。 在什么情况下,哪个比另一个优先? 问题答案: 当你的类实现时,该类的方法将定义该对象的“自然”顺序。根据合同,该方法有义务(尽管不要求)与该对象上的其他方法保持一致,例如,当比较返回true 时,应始终为对象返回0 。 一个比较本身就是如何比较两个对象的定义,可用于可能不与自然顺序排列的方式来比较的对象。 例如,字符串通
当我在浏览上面的接口时,在阅读了许多相同主题的站点后,我对这些接口的语法不是很清楚。 请考虑以下代码段: 如果每个查询都是可理解的。
问题内容: 我有一个需要在字段上排序的对象列表,例如“分数”。我不加思索地编写了一个实现Comparator的新类,该类可以完成任务并且可以工作。 现在回头看一下,我想知道是否应该让我的类实现Comparable,而不是创建一个实现Comparator的新类。分数是订购对象的唯一字段。 我做的可接受的做法是什么? 正确的方法是“首先让类实现Comparable(用于自然排序),如果需要替代字段比较
我有一个关于compareTo函数如何帮助比较器排序的问题,即o1。比较(o2)与o2。比较(o1) 如果两个字符串相等,则此方法返回0,否则返回正值或负值。如果第一个字符串在词典上大于第二个字符串,则结果为正,否则结果为负。 上面的陈述很简单,但是为什么o1.compare(o2)会给我一个升序,而o2.compare(o1)给了我一个降序? 如果我有整数值“5,10,3”,我得到3,5,10和
我正在尝试编写一个使用最小优先级队列的算法,所以我在谷歌上四处查看并找到了PriorityQueue。不过,似乎为了使用它,我需要告诉它我希望它如何排列优先级,并且这样做的方法是使用比较器(我想比较我的“Node1”对象的特定数据字段)。更多的谷歌搜索提出了创建一个新的比较器的想法,它实现了比较器但覆盖了比较方法。我正在尝试的是这样(以及它的其他变体): 编译器有几个理由提出抗议,其中之一是我没有
Java在进行比较时抛出的错误是: 然后比较的方法(比较器 你知道发生了什么事吗?