我有一個類Library,它包含一個Book對象數組,我需要根據Book的屬性對數組進行排序標題或PageNumber。我不允許在Book中使用Comparable類。你會如何推薦我在庫中對書籍進行排序?寫我自己的排序?還是有更簡單的方法?如果你需要代碼片段,請問!Java Sorting:按屬性排序對象數組,對象不允許使用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
}
});
好的,你能幫我實現一個基本的實現嗎?我對Java很新,所以我用public class Library聲明Library實現Comparable
比較器是一個獨立的類,它是你的課程的補充。有很多方法可以做到這一點,但常見的選擇是使用匿名類,並添加了一個例子。 –
Alrighty,我看到了這個的基礎知識,最後一件事就是在我的代碼中實現這一點,就像說我在庫中有一個函數public void sort(){}那會是我把這段代碼扔進去的地方嗎?然後對它進行排序我將使用Arrays.sort(arrayname,?) – samuraiseoul
棒這在您的圖書館:
java.util.Collections.sort(bookList, bookComparator);
booklist會是陣列的名字吧?關於bookComparator呢? – samuraiseoul
bookComparator將是比較器接口實現的一個實例,它考慮了圖書特定的屬性(如標題,ISBN等)。在這個例子中,bookList是一個列表,它很容易從數組中獲得,但是你可以堅持數組並執行:Arrays.sort(bookArray,bookComparator); –
如果你可以使用Comparators
,寫出每種類型排序,你所需要的,例如,爲提升書名和下降的頁碼。如果第一個參數大於第二個參數,則Comparator
的compare
方法必須返回正數,如果第一個參數較小,則返回負數,如果相等,則返回零。
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()));
}
}
謝謝!非常好!我正在使用Peter的建議,而且這種實現方式在我的課程中變得更好一些,但是,這真的很棒,而且我在回收上遇到了問題,所以看到代碼真的幫了我很大的忙!非常感謝!每次我需要排序時,我都會回到這個問題以供參考! – samuraiseoul
創建一個新的treeMap並在鍵和值之間切換角色。
TreeMap<Title ,Book> treeMap = new TreeMap<Title,Book>();
所有的數據複製到新TreeMap的。
您現在有一個基於標題的排序集合。 (而無需比較:))
-1可愛的黑客你在這裏。即使這很聰明,創建兩個新的TreeMap實例來排序數組也是不值得的。更不用說看看你的代碼的事實,它不知道它的作用。 – mykolaj
擴大@ 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));
- 1. 按屬性排序對象的數組
- 2. 按對象屬性對對象的一個javascript數組排序
- 3. 按對象屬性對對象數組排序
- 4. 按對象的屬性排序對象的數組
- 5. 按字符串屬性對象排序對象的數組
- 6. 按對象排序對象的ArrayList屬性並組織它們
- 7. 按子對象排序對象數組
- 8. 使用JQuery將對象數組按多個屬性排序
- 9. 根據對象屬性對對象數組排序
- 10. 通過對象屬性對對象的javascript數組排序
- 11. PHP - 按對象屬性排列對象數組
- 12. Matlab - 按屬性對對象的單元格數組排序
- 13. 按屬性排序的對象的Javascript數組不工作
- 14. 按屬性值排序對象而不允許空白或重複的算法
- 15. 按兩個屬性排序對象
- 16. 如何使用對象屬性對對象數組進行排序
- 17. Javascript--排序對象的數組對象屬性
- 18. 按ArangoDB中的對象屬性排序
- 19. 按對象屬性排序集合
- 20. 按屬性名稱排序JavaScript對象
- 21. 按屬性值排序javascript對象
- 22. List <>按對象屬性排序
- 23. Nhibernate按嵌套對象屬性排序
- 24. 按屬性排序對象AngularJS
- 25. 排序Java對象,並根據屬性
- 26. Java:屬性上的對象排序Arraylist
- 27. ActiveDirectory對象的允許屬性列表
- 28. 按屬性排列對象數組等於另一個數組的對象
- 29. 如何按這些對象屬性排列對象數組的數組
- 30. 按數組排序對象數組
你也可以使用一個'Comparator'? –
我可以在圖書館,但不能在圖書館。 – samuraiseoul
這個限制是否是人爲的,如在一個任務中,還是有其他原因? –