用于对 java 中的对象数组列表进行排序的可比较和覆盖比较方法
Comparable and overriding compare method for sorting an array lists of objects in java
我想根据对象的一个属性对对象数组列表进行排序,让我们在我的代码中说 'name' ,我搜索并发现了关于使用 'Comparator' 这个选项,下面的 class 是我的对象 :
public class PhoneBook{
long number;
String name;
String family;
String address;
public long getNumber() {
return number;
}
public void setNumber(long number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFamily() {
return family;
}
public void setFamily(String family) {
this.family = family;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
并且我在我的排序方法中覆盖了 'compare' 方法,如下所示:
public void sort()
{
Collections.sort(phoneBooks, new Comparator<PhoneBook>() {
@Override
public int compare(PhoneBook o1, PhoneBook o2) {
return o1.getName().compareToIgnoreCase(o2.getName());
}
});
}
但我的问题是,我很困惑为什么不在第一个代码中实现 'Comparable',如下所示:
public class PhoneBook implements Comparable<PhoneBook>
排序方法效果很好,实际上我尝试了上面的代码,但它给了我错误,所以我删除了工具部分,但我看到它有效。
有两种Collections.sort()
方法。
首先只接收一个Collection
进行排序,使用compareTo
方法。在这种情况下,您的 class 需要实施 Comparable
.
您使用的另一个接收两个参数,第一个是Collection
,第二个是Comparator
。这个不关心你的 class 是否实现了 Comparable<? super YourClass>
因为它使用了提供的 Comparator
.
Lambda 在实现功能接口时派上用场:
Collections.sort(phoneBooks, (o1, o2)-> o1.getName().compareToIgnoreCase(o2.getName()));
您可以通过两种方式在这里做您想做的事 - 一种是使用自定义 Comperator
(如上所示),第二种是实现 Comperable
接口。
你不需要两者都做。
第一种方法 (comparator) - 你 运行 sort 方法与你的比较器,sort 方法将使用它来比较对象。因为它使用比较器,所以不需要你实现 compareTo
和 Comparable
第二种方式 (可比较) - 你 运行 没有任何比较器的排序方法。这里发生的是 sort 方法将使用您在对象
中实现的 Comperable
接口中的 compareTo
方法来比较您的对象
任何一种方法都可以,但您不需要两者
相当:
- Comparable 提供单一排序顺序。换句话说,我们
可以根据id或name或price等单个元素对集合进行排序
- 比较影响原class,实际class修改
- Comparable 提供 compareTo() 方法对元素进行排序。
- 我们可以对Comparable类型的列表元素进行排序
Collections.sort(列表)方法。
比较器:
比较器提供多种排序顺序。换句话说,我们
可以根据多个元素对集合进行排序,例如
id, 名称和价格等
比较器不影响原来的class即实际的class是
未修改。
Comparator提供compare()方法对元素进行排序
我们可以对Comparator类型的列表元素进行排序
Collections.sort(List,Comparator) 方法。
我想根据对象的一个属性对对象数组列表进行排序,让我们在我的代码中说 'name' ,我搜索并发现了关于使用 'Comparator' 这个选项,下面的 class 是我的对象 :
public class PhoneBook{
long number;
String name;
String family;
String address;
public long getNumber() {
return number;
}
public void setNumber(long number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFamily() {
return family;
}
public void setFamily(String family) {
this.family = family;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
并且我在我的排序方法中覆盖了 'compare' 方法,如下所示:
public void sort()
{
Collections.sort(phoneBooks, new Comparator<PhoneBook>() {
@Override
public int compare(PhoneBook o1, PhoneBook o2) {
return o1.getName().compareToIgnoreCase(o2.getName());
}
});
}
但我的问题是,我很困惑为什么不在第一个代码中实现 'Comparable',如下所示:
public class PhoneBook implements Comparable<PhoneBook>
排序方法效果很好,实际上我尝试了上面的代码,但它给了我错误,所以我删除了工具部分,但我看到它有效。
有两种Collections.sort()
方法。
首先只接收一个Collection
进行排序,使用compareTo
方法。在这种情况下,您的 class 需要实施 Comparable
.
您使用的另一个接收两个参数,第一个是Collection
,第二个是Comparator
。这个不关心你的 class 是否实现了 Comparable<? super YourClass>
因为它使用了提供的 Comparator
.
Lambda 在实现功能接口时派上用场:
Collections.sort(phoneBooks, (o1, o2)-> o1.getName().compareToIgnoreCase(o2.getName()));
您可以通过两种方式在这里做您想做的事 - 一种是使用自定义 Comperator
(如上所示),第二种是实现 Comperable
接口。
你不需要两者都做。
第一种方法 (comparator) - 你 运行 sort 方法与你的比较器,sort 方法将使用它来比较对象。因为它使用比较器,所以不需要你实现 compareTo
和 Comparable
第二种方式 (可比较) - 你 运行 没有任何比较器的排序方法。这里发生的是 sort 方法将使用您在对象
中实现的Comperable
接口中的 compareTo
方法来比较您的对象
任何一种方法都可以,但您不需要两者
相当:
- Comparable 提供单一排序顺序。换句话说,我们 可以根据id或name或price等单个元素对集合进行排序
- 比较影响原class,实际class修改
- Comparable 提供 compareTo() 方法对元素进行排序。
- 我们可以对Comparable类型的列表元素进行排序 Collections.sort(列表)方法。
比较器:
比较器提供多种排序顺序。换句话说,我们 可以根据多个元素对集合进行排序,例如 id, 名称和价格等
比较器不影响原来的class即实际的class是 未修改。
Comparator提供compare()方法对元素进行排序
我们可以对Comparator类型的列表元素进行排序 Collections.sort(List,Comparator) 方法。