Rea*_*nar 1 java sorting arraylist compareto
从我所看到的所有排序方法示例中,我从未遇到过传递比较器定义的示例。如果比较器被设计为返回负数,正数或0来对对象进行排序,那么排序方法对该信息有何作用?排序方法如何从比较器定义中获取有意义的信息并执行其操作?
这是有问题的排序方法:
public void sort() {
library.sort(new BookComparator());
}
Run Code Online (Sandbox Code Playgroud)
这是整个Comparator类:
import java.util.Comparator;
public class BookComparator implements Comparator<Book> {
public int compare(Book a, Book b) {
if(a == null || b == null) {
throw new NullPointerException();
}
int result = 0 ;
if(a.getAuthor() == null) {
if(b.getAuthor() != null) {
result = -1;
}
} else if(b.getAuthor() == null) {
result = 1;
} else {
result = a.getAuthor().compareTo(b.getAuthor());
}
if(result !=0) {
return result;
}
if(a.getTitle() == null) {
if(b.getTitle() != null) {
result = -1;
}
} else if(b.getTitle() == null) {
result = 1;
} else {
result = a.getTitle().compareTo(b.getTitle());
}
if(result !=0) {
return result;
}
if(a.getYear() < b.getYear()){
return -1;
} else if (a.getYear() == b.getYear()){
return 0;
} else {
return 1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以将Comparator的实例传递到sort方法中,以便您可以对对象进行默认/自然方式之外的其他方面的排序。
例如,如果具有Book对象,则自然排序可能基于标题。但是,如果您想根据杜威十进制数排序呢?还是基于作者的名字?还是页数?您可以通过编写一个比较器来比较Book对象的那些字段来做到这一点。
实际的排序算法不需要知道要排序的对象。它只需要一个比较器是一致的(即比较A <B和B <C然后比较A <C和C> B和B> A,等等)。