我有一个类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
这个限制是否是人为的,如在一个任务中,还是有其他原因? –