用于在java

时间:2015-11-29 22:16:36

标签: java arraylist comparable override

我想根据对象的一个​​属性对对象的数组列表进行排序,这可以在我的代码中找到&name;' name' ,我搜索并发现使用' Comparator'对于此选项,以下类是我的对象:

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

}

我覆盖了'比较'我的排序方法中的方法,如下所示:

public void sort()
{
    Collections.sort(phoneBooks, new Comparator<PhoneBook>() {
        @Override
        public int compare(PhoneBook o1, PhoneBook o2) {
            return o1.getName().compareToIgnoreCase(o2.getName());
        }
    });
}

但我的问题是,我很困惑,为什么不实施&#39; Comparable&#39;在第一个代码中这样:

public class PhoneBook implements Comparable<PhoneBook>

排序方法运行良好,实际上我尝试了上面的代码并且它给了我错误,所以我删除了实现部分,但我看到它有效。

3 个答案:

答案 0 :(得分:2)

有两种Collection方法。

首先只收到一个compareTo进行排序并使用Comparable方法。在这种情况下,您的课程需要实施Collection

你曾经使用过的另一个接收两个参数,第一个是Comparator第二个是Comparable<? super YourClass>。如果您的班级使用Comparator提供Collections.sort(phoneBooks, (o1, o2)-> o1.getName().compareToIgnoreCase(o2.getName())); ,那么这一点并不在乎。

Lambda在实现功能接口时派上用场:

function cmp($a, $b){       
    return (floatval($a) == floatval($b)?0:((floatval($a) < floatval($b)) ? -1 : 1));
}

$a = array("1M", "15M", "1.5M", "3M", "38M","3.5M");

usort($a, "cmp");
print_r($a);
// foreach ($a as $key => $value) {
    // echo "$key: $value\n";
// }

Output : Array ( [0] => 1M [1] => 1.5M [2] => 3M [3] => 3.5M [4] => 15M [5] => 38M ) 

答案 1 :(得分:2)

您可以通过两种方式在此处执行所需操作 - 一种是使用自定义Comperator(如上所述),第二种是通过实现Comperable界面。 你不需要同时做这两件事。

第一种方式(比较器) - 使用比较器运行sort方法,sort方法将使用它来比较对象。由于它使用比较器,因此不需要您实现compareToComparable

第二种方式(可竞争) - 在没有任何编译器的情况下运行sort方法。这里发生的是sort方法将使用您在对象中实现的compareTo接口的Comperable方法比较您的对象

无论哪种方式都有效,但你不需要两者

答案 2 :(得分:2)

可比较:

  1. Comparable提供单一排序顺序。换句话说,我们 可以基于单个元素(如id或名称或价格等)对集合进行排序。
  2. Comparable影响原始类,实际类被修改。
  3. Comparable提供了compareTo()方法来排序元素。
  4. 我们可以按比例对可比较类型的列表元素进行排序 Collections.sort(List)方法。
  5. 比较者:

    1. 比较器提供多个排序顺序。换句话说,我们 可以基于多个元素对集合进行排序 身份证,姓名和价格等。

    2. 比较器不影响原始类,即实际类 未修改。

    3. Comparator提供了compare()方法来排序元素。

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