1

Product私のプログラムは、オブジェクトが次のインスタンス変数を含むクラスを実装しています: namepriorityprice、およびamount

で他の操作を行う前に、並べ替える必要があるオブジェクトがありLinkedListます。ProductLinkedList

最初にリストを優先度順に並べ替えます (最低から​​最高)。優先度が同じ場合は、価格 (低いものから高いものへ)、次に名前 (アルファベット順) を調べます。

Collections.sortComparable、およびについて多くのことを読みましたComparatorComparableインターフェイスを使用してメソッドを実装する必要があると思いますcompareTopriorityprice、 の両方nameが「自然な」順序付けを持っているため、 を使用する方が理にかなっているというのが私の考えです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)。コードを書き始める前に、何か抜けているか忘れているかどうか教えてもらえますか?

** * ** * ** * ****更新* ** * ** * ** * ** * ** * ** * ** * ** * ** * ** *

比較メソッドを使用して、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 から次のエラーが表示されます。

Collections 型のメソッド sort(List, Comparator) は、引数 (LinkedList、ProductComparator) には適用されません。

このエラーが発生する理由を知っている人はいますか?それを解決するために正しい方向に向けることができますか?

4

3 に答える 3

3

「自然な」順序付けがある場合は、Comparable を使用します。順序が「自然」であるかどうかを判断するための経験則は、オブジェクトの順序が常にそうであるかどうかです。

そうは言っても、Comparable を使用するか Camparator を使用するかの決定は、あまり考える必要があるような決定ではありません。ほとんどの IDE には、Comparable と Comparator の間の変換を非常に簡単にするリファクタリング ツールがあります。したがって、今間違った道を歩むことを選択したとしても、それを変えるのにそれほど多くの努力は必要ありません。

于 2012-11-24T17:01:33.553 に答える
2

ここで製品に対して定義する順序は非常に具体的であり、

  • プログラムの将来のバージョンで変更される可能性があります
  • コンテキストのパラメータ化で強化される可能性があります
  • 新機能については説明しません

だから「自然」とは言い難い。

たとえば、定数を定義することをお勧めします

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

次に、どこでも簡単に並べ替えることができます

Collections.sort(myProductList, Product.STANDARD_COMPARATOR);

他のコンパレータを追加すると、コードはより良い方法で進化します。

一般的に継承よりも構成を優先する必要があるのと同様に、オブジェクトの動作を不変の方法で定義することは避けるようにしてください。

于 2012-11-24T16:58:55.387 に答える
0

ご注文が数字のみに基づいていた場合は、Comparable問題ありません。

ただし、順序には (場合によっては) テキストの字句順序が含まれるため、Comparatorクラスの方が優れComparableString.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;
    }
}

Comparable と Comparator のどちらを使用するかに関係なく、比較コードと同じ属性をチェックProductするメソッドがあることを確認するのが賢明です。equals

于 2012-11-24T21:48:30.580 に答える