2011-01-22 66 views
5

我被困在我有一個對象圖書,進行了三個變量Java的複雜排序

String title 
int Year 
String authorName 

我必須用一種,兩種或升序所有三個變量或降序排列的書籍進行排序,我實現標題排序,但我堅持要做什麼,當人們選擇多個變量來訂購。

下面是我的一些代碼:

圖書類:

import java.util.ArrayList; 


public class Book{ 

String title; 
String authorName; 
int editionYear; 

public Book(String title, String authorName, int editionYear){ 
    this.title = title; 
    this.authorName = authorName; 
    this.editionYear = editionYear; 

} 

public String getBookInfo(){ 

    ArrayList bookInfo = new ArrayList(); 
    bookInfo.add(this.title); 
    bookInfo.add(this.authorName); 
    bookInfo.add(this.editionYear); 
    return bookInfo.toString(); 
} 

} 

BookSorter類:

import java.util.Arrays; 
import java.util.Comparator; 

public class BookSorter{ 

private String sortkey; 
private String order; 
Book[] Books; 

public BookSorter(Book Book1, Book Book2, Book Book3, Book Book4){ 
    this.Books = new Book[] {Book1, Book2, Book3, Book4}; 
} 

public Book[] sortByTitle(boolean sortorder){ 
    Comparator<Book> byTitle = new TitleComparator(sortorder); 
    Arrays.sort(Books, byTitle); 
    for(int i=0;i<4;i++) System.out.println(Books[i].title); 
    return Books; 
} 
} 

TitleComparator:

import java.util.Comparator; 

class TitleComparator implements Comparator<Book> { 

boolean ascending; 

public TitleComparator(boolean ascending){ 
    this.ascending = ascending; 
} 

public int compare(Book Book1, Book Book2){ 
    if(ascending == true){ 
     if(Book1.title.compareToIgnoreCase(Book2.title) > 0) return 1; 
     else if(Book1.title.compareToIgnoreCase(Book2.title) < 0) return -1; 
     else return 0; 
    }else{ 
     if(Book2.title.compareToIgnoreCase(Book1.title) < 0) return -1; 
     else if(Book2.title.compareToIgnoreCase(Book1.title) > 0) return 1; 
     else return 0; 
    } 
} 
} 

不過,我覺得我可以工作小莫在比較器上,但我真的被困在如何建模這樣的事情,在此先感謝

+0

這功課嗎?如果是這樣,請將其標記爲這樣。 – CoolBeans 2011-01-22 21:45:33

+0

這是沒有功課,我正在學習評估; D – bwagner 2011-01-22 22:26:08

+0

@CoolBeans:請[不要暗示元標記](http://meta.stackexchange.com/questions/10811/how-to-ask-and -answer-功課 - 問題)。 – 2011-01-22 22:57:54

回答

2

這聽起來像一個功課問題。所以我會給你提供一些提示。

1. First see if Title1==Title2. 
    1.1 if YES then see if year1==year2 
      1.1.1 if YES then see if authorName1==authorName2 
       1.1.1.1 If YES then they are equal (return 0) 
       1.1.1.2 else if NO compare author1 and author2 (return 1 or -1) 
    1.2 else if NO then compare year1 and year2 (return 1 or -1) 
2. else if NO then compare title1 and title2 (return 1 or -1) 
2

升序/降序可以更容易實現,因爲它簡單地「倒置」了比較結果。你可以 「重用」 從compareToIgnoreCase方法的結果:

public int compare(Book book1, Book book2) {  
    int result = book1.title.compareToIgnoreCase(book2.title); 
    return ascending ? result : result * -1; 
} 

其他比較是相當similiar(限制樣本比較法):

public int compare(Book book1, Book book2) {  
    int result = book1.author.compareToIgnoreCase(book2.author); 
    return ascending ? result : result * -1; 
} 

public int compare(Book book1, Book book2) { 
    Integer year1 = book1.year; 
    Integer year2 = book2.year; 
    int result = year1.compareTo(year2); 
    return ascending ? result : result * -1; 
} 
2

寫3個比較器類,每個比較器都比較一個特定的屬性,然後比較整個比較器類,並獲取比較器的有序列表。

或者使用org.apache.commons.collections.comparators.ComparatorChain這類庫中的一些便利課程。

編輯:

OP問:

我怎麼能寫,總體比較:

喜歡的東西:

// private List<Comparator<?>> comparators; // initialized in constructor 

// compare method(book1, book2): 
//  note that while result == 0, books have had equal attributes so far 
//  once result is != 0, the books are now ordered - no need to compare further 
//  if we run out of comparators and result still == 0, books are equal. 

//  initialize iterator to list of comparators 
//  int result = 0; 
//  while result == 0 && still more comparators 
//   get current comparator from iterator 
//   result = comparator.compare(book1, book2); // compare current attribute 
//  end-while 
//  return result