用于对 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 方法将使用它来比较对象。因为它使用比较器,所以不需要你实现 compareToComparable

第二种方式 (可比较) - 你 运行 没有任何比较器的排序方法。这里发生的是 sort 方法将使用您在对象

中实现的 Comperable 接口中的 compareTo 方法来比较您的对象

任何一种方法都可以,但您不需要两者

相当:

  1. Comparable 提供单一排序顺序。换句话说,我们 可以根据id或name或price等单个元素对集合进行排序
  2. 比较影响原class,实际class修改
  3. Comparable 提供 compareTo() 方法对元素进行排序。
  4. 我们可以对Comparable类型的列表元素进行排序 Collections.sort(列表)方法。

比较器:

  1. 比较器提供多种排序顺序。换句话说,我们 可以根据多个元素对集合进行排序,例如 id, 名称和价格等

  2. 比较器不影响原来的class即实际的class是 未修改。

  3. Comparator提供compare()方法对元素进行排序

  4. 我们可以对Comparator类型的列表元素进行排序 Collections.sort(List,Comparator) 方法。