gpt4 book ai didi

java - java中的比较器和可比实现

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:21 25 4
gpt4 key购买 nike

我知道这些接口(interface)用于对集合中的对象进行排序。但我怀疑它们之间的真正区别。我读到的一个事实是,当您想要比较两个对象而不使用当前对象(this)时,请使用可比较。

但我的问题是,即使使用比较器,我们也可以比较相同的对象类型。

这里到底有什么区别。我很困惑。假设下面的例子,

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;
}
}

如果我使用比较器,我将有一个类实现比较器,而不是 this.age,它有 person.age。那么这里有什么不同呢?

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,列表如何根据升序或降序对项目进行排序?我认为这是考虑到差异并根据差异进行排序。

最佳答案

考虑 Comparable 的文档

This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class's natural ordering, and the class's compareTo method is referred to as its natural comparison method.

Comparator

A comparison function, which imposes a total ordering on some collection of objects. Comparators can be passed to a sort method (such as Collections.sort or Arrays.sort) to allow precise control over the sort order. Comparators can also be used to control the order of certain data structures (such as sorted sets or sorted maps), or to provide an ordering for collections of objects that don't have a natural ordering.

Comparable 对象可以通过将自身与另一个对象进行比较(自然排序)来确定其顺序,而 Comparator 是一个知道如何比较两个对象并确定其特定顺序的对象。这里的区别在于谁负责比较。

自然排序通过 compareTo 强加了一个定义的顺序,但是如果您想更改该顺序,或者更糟糕的是,没有定义的比较逻辑怎么办?这就是 Comparator 派上用场的地方,因为您可以根据不同的比较对集合进行排序,这些比较可以通过发出新的 Comparator 动态切换,而不是一些令人讨厌的逻辑,您应该告诉 Comparable 对象“嘿,现在您根据名称而不是年龄排序”。

对于比较结果之间的差异,会针对每个对象进行检查。例如,以年龄分别为 101520 的三个人为例。 1510 比较时返回 1,但与 20 比较时返回 -1,定义三个人的顺序。

选择适合您需求的方法。如果您的比较逻辑稳定并且将来不会更改,您可能需要使用 Comparable 对象,但如果您需要根据不同的条件对集合进行排序,则应该使用 Comparator 对象。

关于java - java中的比较器和可比实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13707651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com