Bookオブジェクトの配列を含むクラスLibraryがあり、Bookのプロパティ(TitleまたはPageNumber)に基づいて配列を並べ替える必要があります。この問題は、BookでComparableクラスを使用することを許可されていません。ライブラリ内の書籍の配列を並べ替えることをどのように推奨しますか?私自身のソートを書きますか?それとももっと簡単な方法はありますか?コードのスニペットが必要な場合は、質問してください。
Comparator
など、任意のタイプを比較するためにComparable
を指定できます。
使用する配列とコレクションの場合
Arrays.sort(array, myComparator);
Collections.sort(list, myComparator);
TreeSetのようなソートされたコレクションでさえ、カスタムコンパレータを取ることができます
例えば.
Collections.sort(books, new Comparator<Book>() {
public int compare(Book b1, Book b2) {
return if b1 is greater return +1, if b2 is smaller return -1 otherwise 0
}
});
Comparators
を使用できる場合は、必要な並べ替えの種類ごとに1つ記述します。たとえば、本のタイトルは昇順、ページ番号は降順です。 compare
のComparator
メソッドは、最初の引数が2番目の引数よりも大きい場合は正、最初の引数が小さい場合は負、等しい場合はゼロを返す必要があります。
import Java.util.Comparator;
import Java.util.List;
import Java.util.Arrays;
class Book{
String title;
int pageNumber;
public Book(String title, int pageNumber){
this.title = title;
this.pageNumber = pageNumber;
}
String getTitle(){ return title; }
int getPageNumber(){ return pageNumber; }
public String toString(){
return "(" + title + ", " + pageNumber + " pages)";
}
}
public class Library{
// These variables are static because you don't need multiple copies
// for sorting, as they have no intrinsic state.
static private Comparator<Book> ascTitle;
static private Comparator<Book> descPageNumber;
// We initialize static variables inside a static block.
static {
ascTitle = new Comparator<Book>(){
@Override
public int compare(Book b1, Book b2){
return b1.getTitle().compareTo(b2.getTitle());
}
};
descPageNumber = new Comparator<Book>(){
@Override
public int compare(Book b1, Book b2){
// Java 7 has an Integer#compare function
return Integer.compare(b1.getPageNumber(), b2.getPageNumber());
// For Java < 7, use
// Integer.valueOf(n1).compareTo(n2);
// DO NOT subtract numbers to make a comparison such as n2 - n1.
// This can cause a negative overflow if the difference is larger
// than Integer.MAX_VALUE (e.g., n1 = 2^31 and n2 = -2^31)
}
};
}
private Book[] books;
public Book[] getBooks(){ return books; }
public void sortAscTitle(){
Arrays.sort(books, ascTitle);
}
public void sortDescPageNumber(){
Arrays.sort(books, descPageNumber);
}
public Library(Book[] books){
this.books = books;
}
public static void main(String[] args){
Library library = new Library( new Book[]{
new Book("1984", 123),
new Book("I, Robot", 152),
new Book("Harry Potter and the Philosopher's Stone", 267),
new Book("Harry Potter and the Goblet of Fire", 759),
new Book("The Bible", 1623)
});
library.sortAscTitle();
System.out.println(Arrays.toString(library.getBooks()));
library.sortDescPageNumber();
System.out.println(Arrays.toString(library.getBooks()));
}
}
これをあなたのライブラリに貼り付けてください:
Java.util.Collections.sort(bookList, bookComparator);
@PeterLawreyの答えをJava 8に拡張すると、Comparable<T>
デリゲートの代わりに ラムダ式 を使用できるようになります。
Collections.sort(books, (firstBook, secondBook -> b1 is greater return +1,
if b2 is smaller return -1 otherwise 0));