了解比较器调用比较方法
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
大小小于 tv2
,compare
方法将 return -1
。下一步,如何比较tv3
的大小呢?
-1
与 42
相比吗?
比较是在对象之间进行的,而不是在其他比较的值 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
方法。因此,您不能对要比较的对象做出任何假设。
我正在查看 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
大小小于 tv2
,compare
方法将 return -1
。下一步,如何比较tv3
的大小呢?
-1
与 42
相比吗?
比较是在对象之间进行的,而不是在其他比较的值 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
方法。因此,您不能对要比较的对象做出任何假设。