可比较:使用compareTo比较各种参数上的对象

时间:2016-06-17 03:08:04

标签: java comparator comparable

我正在研究比较器和类似接口之间的差异。

在其他网站上甚至在stackoverflow上都提到我们在需要对各个字段进行排序时使用了Comparator。

现在我正在使用像这样的可比较

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

class HDTV implements Comparable<HDTV> {
    private int size;
    private String brand;
    private int price;

    public HDTV(int size, String brand, int price) {
            this.size = size;
            this.brand = brand;
            this.price = price;
    } 


    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    @Override
    public int compareTo(HDTV tv) {

        if (this.getSize() > tv.getSize())
            return 1;
        else if (this.getSize() < tv.getSize())
            return -1;
        else if (this.getPrice() > tv.getPrice())
            return 1;
        else if (this.getPrice() < tv.getPrice())
            return -1;
        else
            return 0;
    }
}

public class Test {
    public static void main(String[] args) {
        HDTV tv1 = new HDTV(60, "Samsung", 30000);
        HDTV tv2 = new HDTV(60, "Sony", 20000);
        HDTV tv3 = new HDTV(50, "LG", 20000);
        List<HDTV> l = new ArrayList<>();
        l.add(tv1);
        l.add(tv2);
        l.add(tv3);
        Collections.sort(l);
        Iterator it = l.iterator();
        while (it.hasNext())
            System.out.println(((HDTV)it.next()).getBrand());
        if (tv1.compareTo(tv2) > 0) {
            System.out.println(tv1.getBrand() + " is better.");
        } else {
            System.out.println(tv2.getBrand() + " is better.");
        }
    }
}

上述程序帮助我们首先对尺寸进行排序然后再按价格进行排序,这意味着我们可以使用两个参数进行排序。(根据我的理解,这是错误的)。

是的,这段代码可能是错的,但我无法弄明白。

我收到了预期的订单。

请帮我澄清一下我的疑惑。

2 个答案:

答案 0 :(得分:1)

您在评论中引用的链接指出:

  

Comparable提供单一排序序列。换句话说,我们可以根据id,name或price等单个元素对集合进行排序。

VS

  

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

这里的混淆是短语&#34;多重排序序列&#34;以及描述不正确的事实。

他们的意思是,如果您使用Comparable接口,那么将始终根据compareTo()方法中实现的一个序列对对象进行排序。根据对象的多个字段,序列可以像您需要的那样复杂。

使用Comparator时,您可以动态提供归类序列,并且可以实现许多不同的Comparator对象,这些对象以不同的方式对集合进行排序。这就是他们所说的&#34;多重排序顺序&#34;。

在这两种情况下,基于单个字段或多个字段,比较的定义可以是简单的或复杂的。使用多个Comparator,您可以以不同的方式对对象进行排序。

在您的示例中,您可以Comparator对品牌名称进行排序,而另一个则按价格排序,然后按尺寸排序。

至于那个网页,我会找到一个更好的网页。最好的参考始终是Oracle文档。学习阅读Javadoc,您将始终获得最佳信息。有时可能有点难以阅读,但值得投资。

答案 1 :(得分:0)

比较器和类似用途有两个不同的目的..两者都用于按照你想要的方式对物体进行排序。在上述情况下,您只能根据大小和价格对特定情况进行排序,以便对电视进行排序。 将来,如果您希望仅按价格排序...那么您必须在上述方法中更改compareTo方法。但是,您可以编写一个Comparator接口,您可以使用Collections.sort(1,new PriceComparator())在不更改类的情况下对tv元素进行排序。希望这是一个问题。