2012-09-16 73 views
9

我有一個類Library,它包含一個Book對象數組,我需要根據Book的屬性對數組進行排序標題或PageNumber。我不允許在Book中使用Comparable類。你會如何推薦我在庫中對書籍進行排序?寫我自己的排序?還是有更簡單的方法?如果你需要代碼片段,請問!Java Sorting:按屬性排序對象數組,對象不允許使用Comparable

+0

你也可以使用一個'Comparator'? –

+0

我可以在圖書館,但不能在圖書館。 – samuraiseoul

+1

這個限制是否是人爲的,如在一個任務中,還是有其他原因? –

回答

18

您可以提供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 
    } 
}); 
+0

好的,你能幫我實現一個基本的實現嗎?我對Java很新,所以我用public class Library聲明Library實現Comparable {}? – samuraiseoul

+1

比較器是一個獨立的類,它是你的課程的補充。有很多方法可以做到這一點,但常見的選擇是使用匿名類,並添加了一個例子。 –

+0

Alrighty,我看到了這個的基礎知識,最後一件事就是在我的代碼中實現這一點,就像說我在庫中有一個函數public void sort(){}那會是我把這段代碼扔進去的地方嗎?然後對它進行排序我將使用Arrays.sort(arrayname,?) – samuraiseoul

1

棒這在您的圖書館:

java.util.Collections.sort(bookList, bookComparator); 
+0

booklist會是陣列的名字吧?關於bookComparator呢? – samuraiseoul

+0

bookComparator將是比較器接口實現的一個實例,它考慮了圖書特定的屬性(如標題,ISBN等)。在這個例子中,bookList是一個列表,它很容易從數組中獲得,但是你可以堅持數組並執行:Arrays.sort(bookArray,bookComparator); –

4

如果你可以使用Comparators,寫出每種類型排序,你所需要的,例如,爲提升書名和下降的頁碼。如果第一個參數大於第二個參數,則Comparatorcompare方法必須返回正數,如果第一個參數較小,則返回負數,如果相等,則返回零。

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())); 
    } 
} 
+0

謝謝!非常好!我正在使用Peter的建議,而且這種實現方式在我的課程中變得更好一些,但是,這真的很棒,而且我在回收上遇到了問題,所以看到代碼真的幫了我很大的忙!非常感謝!每次我需要排序時,我都會回到這個問題以供參考! – samuraiseoul

-1

創建一個新的treeMap並在鍵和值之間切換角色。

TreeMap<Title ,Book> treeMap = new TreeMap<Title,Book>();

所有的數據複製到新TreeMap的。

您現在有一個基於標題的排序集合。 (而無需比較:))

+1

-1可愛的黑客你在這裏。即使這很聰明,創建兩個新的TreeMap實例來排序數組也是不值得的。更不用說看看你的代碼的事實,它不知道它的作用。 – mykolaj

0

擴大@ PeterLawrey的回答到Java 8,你現在可以使用Lambda Expression代替Comparable<T>委託:

Collections.sort(books, (firstBook, secondBook -> b1 is greater return +1, 
                if b2 is smaller return -1 otherwise 0));