2012-11-24 287 views
1

我的程序實現了Product類,其對象包含以下實例變量:name,prioritypriceamount決定使用類比或比較器

我有我需要的LinkedList做任何其他操作之前排序ProductLinkedList對象。

我想先列出優先順序(從最低到最高)。如果優先級相同,則查看價格(從最低到最高),然後查看名稱(字母順序)。

我已經做了大量的關於Collections.sort,ComparableComparator的閱讀。我相信我需要使用Comparable接口並實施compareTo方法。我的想法是,因爲prioritypricename都具有「自然」排序,所以使用Comparable更有意義。

public class Product extends ProductBase implements PrintInterface, Comparable<Product>{ 
    private String name; 
    private int priority; 
    private int cents; 
    private int quantity; 

    // setters and getters 

    /** 
    * Compare current Product object with compareToThis 
    * return 0 if priority, price and name are the same for both 
    * return -1 if current Product is less than compareToThis 
    * return 1 if current Product is greater than compareToThis 
    */ 

    @override 
    public int compareTo(Product compareToThis) 
} 

然後,當我想我的排序LinkedList的我就叫Collections.sort(LinkedList)。在我開始編寫代碼之前,你能告訴我我是否錯過或忘記了任何東西嗎?

** * ** * ** * ****UPDATE* ** * ** * ** * * * * ** * ** * ** * ** * ** * ** *

我剛剛創建了一個名爲ProductComparator用比較方法單獨的類。

這是LinkedList類的一部分。這

import java.util.Collections; 

public class LinkedList { 

private ListNode head; 

public LinkedList() { 
    head = null; 
} 
    // this method will sort the LinkedList using a ProductComparator 
public void sortList() { 
    ListNode position = head; 
    if (position != null) { 
     Collections.sort(this, new ProductComparator()); 
    } 
} 
// ListNode inner class 
private class ListNode { 

    private Product item; 
    private ListNode link; 

    // constructor 
    public ListNode(Product newItem, ListNode newLink) { 
     item= newItem; 
     link = newLink; 
    } 
} 

}

我從IDE收到以下錯誤,當我編譯。

類型集合中的方法sort(List,Comparator)不適用於參數(LinkedList,ProductComparator)。

有沒有人知道我爲什麼得到這個錯誤,並可以指出我在正確的方向來解決它?

+0

更新了您的問題:您是否已在ProductComparator中正確實施了Comparator? –

回答

2

您在此處定義你的產品的順序是非常具體和

  • 可能會在你的程序的未來版本
  • 可能與上下文參數富集改變
  • 將不包括新功能

所以很難被說「自然」。

我建議定義常量,例如

public static Comparator<Product> STANDARD_COMPARATOR = new Comparator<Product>() { 
    public int compare(Product p1, Product p1) { 
     return ... 
    } 
}; 

,那麼你就能夠輕鬆地排序任何地方

Collections.sort(myProductList, Product.STANDARD_COMPARATOR); 

您的代碼會以更好的方式演變爲你會添加其他比較器。

就像你通常應該更喜歡繼承組成,你應該儘量避免在確定不變的方式你的對象的行爲。

+0

你好,我不太明白。你能提供一個更詳細的建議例子嗎? – user1834529

+0

@ user1834529我編輯過。它更清楚嗎? –

+0

是的,我認爲是這樣,但我相信我會在開始編碼時遇到一些問題。 – user1834529

3

如果有「自然」排序,請使用「比較」。確定訂單是否「自然」的經驗法則是,對象的訂單總是始終是

話雖如此,是否使用Comparable或Camparator的決定不是您需要考慮太多的決定。大多數IDE都有重構工具,可以輕鬆實現Comparable和Comparator之間的轉換。所以,如果你現在選擇走錯路,改變它並不需要太多的努力。

+0

當您在團隊中或與客戶一起編碼時,您最好有良好的演變API,而不要指望您的IDE稍後再修復它們。 –

+0

完全同意。但* Comparable *接口幾乎不是(使用的)公共API的一部分,除非它真的是一個自然順序。如果有人使用它,儘管它不代表自然排序,但可能是因爲他們不關心排序是什麼。 – onon15

0

如果您的訂單僅基於數字,Comparable會沒事的。

然而,由於您的訂單(有時)涉及文本的詞彙順序, 一個Comparator類是較好的,因爲使用的Comparable將意味着使用 String.compareTo這將阻止你有國際化。

實現Comparator的單獨類可以使用 本地化的Collator來比較字符串。例如:

public class ProductComparator 
implements Comparator<Product> { 
    private final Collator collator; 

    public ProductComparator() { 
     this(Locale.getDefault()); 
    } 

    public ProductComparator(Locale locale) { 
     this.collator = Collator.getInstance(locale); 
    } 

    public int compare(Product product1, 
         Product product2) { 

     int c = product1.getPriority() - product2.getPriority(); 
     if (c == 0) { 
      c = product1.getPrice() - product2.getPrice(); 
     } 
     if (c == 0) { 
      c = collator.compare(product1.getName(), product2.getName()); 
     } 
     return c; 
    } 
} 

無論你去與相當或比較,這是明智 確保Productequals方法,檢查同一 屬性作爲比較的代碼。

+0

謝謝VGR。那麼調用Collections.sort的正確方法是什麼?它是Collections.sort(MyLinkedListOfProductObjects,新的ProductComparator)嗎? – user1834529

+0

我試過你的建議來實現Comparator類對象並將它傳遞給Collections.sort。我收到一條錯誤消息,我不知道爲什麼。我從IDE獲取的錯誤消息是: 類型集合中的方法排序(列表,比較器)不適用於參數(LinkedList,ProductComparator)。你知道我收到這個錯誤,你能指出我的方向嗎? – user1834529

+0

這是我的LinkedList代碼的一部分。 import java.util.Collections;公共類LinkedList { } \t private ListNode head; \t public LinkedList(){ \t \t head = null; \t} \t公共無效sortlist中(){ \t ListNode位置=頭; \t \t if(position!= null){ \t Collections.sort(this,new ProductComparator()); \t \t} \t} \t私有類ListNode { \t \t私人產品項目; \t \t \t \t private ListNode link; \t \t \t 公共\t ListNode(產品的newitem,ListNode NEWLINK){ \t \t \t項=的newitem; \t \t \t link = newLink; \t \t} \t} } – user1834529