了解比较器调用比较方法

Understanding Comparator call to compare method

我正在查看 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());
        }
    }
}

当在 Collections.sort() 中调用 new SizeComparator() 方法时,据我所知,首先将 tv1 的大小与 tv2 进行比较。这里由于 tv1 大小小于 tv2compare 方法将 return -1。下一步,如何比较tv3的大小呢? -142 相比吗?

比较是在对象之间进行的,而不是在其他比较的值 return 之间进行的。 那么它将是 tv2 与 tv3 比较 (return 1),tv3 与 tv1 (return -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;
        }
    }

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

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