了解比较器调用比较方法

时间:2015-03-23 03:31:39

标签: java collections comparator

我正在浏览here的以下代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class HDTV {
    private int size;
    private String brand;

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

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

class SizeComparator implements Comparator<HDTV> {
    @Override
    public int compare(HDTV tv1, HDTV tv2) {
        int tv1Size = tv1.getSize();
        int tv2Size = tv2.getSize();

        if (tv1Size > tv2Size) {
            return 1;
        } else if (tv1Size < tv2Size) {
            return -1;
        } else {
            return 0;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        HDTV tv1 = new HDTV(55, "Samsung");
        HDTV tv2 = new HDTV(60, "Sony");
        HDTV tv3 = new HDTV(42, "Panasonic");

        ArrayList<HDTV> al = new ArrayList<HDTV>();
        al.add(tv1);
        al.add(tv2);
        al.add(tv3);

        Collections.sort(al, new SizeComparator());
        for (HDTV a : al) {
            System.out.println(a.getBrand());
        }
    }
}

new SizeComparator()内调用Collections.sort()方法时,据我所知,tv1的大小首先与tv2进行比较。此处,由于tv1大小小于tv2compare方法将返回-1。在下一步中,tv3的大小将如何进行比较? 是否将-142进行比较?

3 个答案:

答案 0 :(得分:1)

在对象之间进行比较,而不是由另一个比较返回的值。 那么它将与tv3(返回1),tv3与tv1(返回-1)进行比较。

答案 1 :(得分:1)

为什么要将-1与42进行比较? 42将被比较为55或60,具体取决于Collections.sort使用的排序算法。

检查并查看正在发生的事情的最简单方法是添加一些添加一些调试信息,例如

@Override
    public int compare(HDTV tv1, HDTV tv2) {

        System.out.println("Comparing " tv1.getSize() + " to " tv2.getSize())

        int tv1Size = tv1.getSize();
        int tv2Size = tv2.getSize();

        if (tv1Size > tv2Size) {
            return 1;
        } else if (tv1Size < tv2Size) {
            return -1;
        } else {
            return 0;
        }
    }

答案 2 :(得分:0)

比较方法实际上并没有对列表进行排序。它仅用于比较您提供的两个对象。

Collections.sort方法使用标准排序算法,它在排序时随时使用您实现的compare方法。因此,您无法对将要比较哪些对象做出任何假设。