2012-09-16 74 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));