2016-06-17 9 views
0

コンパレータと同等のインタフェースの違いについて勉強しています。Comparable:compareToを使用してさまざまなパラメータでオブジェクトを比較します。

他のサイトでも、stackoverflow上でも、さまざまなフィールドをソートする必要があるときにComparatorを使用したことが言及されています。

今私は、上記のプログラムは、価格に続いサイズに最初の並べ替えに私たちを助け、この

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Iterator; 
import java.util.List; 

class HDTV implements Comparable<HDTV> { 
    private int size; 
    private String brand; 
    private int price; 

    public HDTV(int size, String brand, int price) { 
      this.size = size; 
      this.brand = brand; 
      this.price = price; 
    } 


    public int getPrice() { 
     return price; 
    } 

    public void setPrice(int price) { 
     this.price = price; 
    } 

    public int getSize() { 
     return size; 
    } 

    public void setSize(int size) { 
     this.size = size; 
    } 

    public String getBrand() { 
     return brand; 
    } 

    public void setBrand(String brand) { 
     this.brand = brand; 
    } 

    @Override 
    public int compareTo(HDTV tv) { 

     if (this.getSize() > tv.getSize()) 
      return 1; 
     else if (this.getSize() < tv.getSize()) 
      return -1; 
     else if (this.getPrice() > tv.getPrice()) 
      return 1; 
     else if (this.getPrice() < tv.getPrice()) 
      return -1; 
     else 
      return 0; 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     HDTV tv1 = new HDTV(60, "Samsung", 30000); 
     HDTV tv2 = new HDTV(60, "Sony", 20000); 
     HDTV tv3 = new HDTV(50, "LG", 20000); 
     List<HDTV> l = new ArrayList<>(); 
     l.add(tv1); 
     l.add(tv2); 
     l.add(tv3); 
     Collections.sort(l); 
     Iterator it = l.iterator(); 
     while (it.hasNext()) 
      System.out.println(((HDTV)it.next()).getBrand()); 
     if (tv1.compareTo(tv2) > 0) { 
      System.out.println(tv1.getBrand() + " is better."); 
     } else { 
      System.out.println(tv2.getBrand() + " is better."); 
     } 
    } 
} 

のようにComparableを使用していますが、我々はまた、同等で2つのパラメータを使用して並べ替えることができますを意味します。(である私の理解あたりとして違う)。

このコードは間違っているかもしれませんが、私はそれを理解することができません。

私は予想通りの注文をしています。

疑問を明確にするのを手伝ってください。

+2

あなたは_「私は期待順序を取得しています」_書いた - あなたが期待される順序を取得している場合、問題は何ですか? –

+1

ゲッターとセッターの間にコンストラクターを置くのはちょっと変です。それは一般的に最初に置かれます。 – Andreas

+0

最初のポイントhttp://www.javatpoint.com/difference-between-comparable-and-comparator 、それは間違っているを参照してください?それを変更 – sparsh610

答えて

1

あなたはコメント状態に引用されたリンク:

同等の単一のソート配列を提供します。言い換えれば、我々は、このような

コンパレータは、複数のソート順序を提供VSなど

IDまたは名前や価格などの単一の要素に基づいてコレクションを並べ替えることができます。つまり、ID、名前、価格などの複数の要素に基づいてコレクションを並べ替えることができます。

ここでの混乱は、「複数の並べ替え順序」の欄と説明が間違っている。

Comparableインターフェイスを使用すると、オブジェクトは常にcompareTo()メソッドで実装されたその1つのシーケンスに従ってソートされます。シーケンスは、オブジェクトの複数のフィールドに基づいて、必要なだけ複雑にすることができます。

Comparatorを使用すると、照合シーケンスが動的に提供され、さまざまな方法でコレクションを並べ替える多くの異なるComparatorオブジェクトを実装できます。これは、「複数ソートシーケンス」によって意味されます。

いずれの場合も、単一のフィールドまたは複数のフィールドに基づいて、比較の定義を単純または複雑にすることができます。 Comparatorを複数使用すると、オブジェクトをさまざまな方法でソートできます。

あなたの例では、Comparatorをブランド名で並べ替えることができ、もう1つは価格で並べ替え、次にサイズで並べ替えることができます。

そのWebページについては、より良いものを見つけるでしょう。最適なリファレンスは、常にOracleのマニュアルです。 Javadocを読むことを学び、あなたは常に最高の情報を得るでしょう。時には読みにくいかもしれませんが、投資価値があります。

+0

'ssequence' - >' sequence' ;-) ---私は "動的"とは言いません。 'sort()'の呼び出しではまだ静的です。 「別々に」より良いかもしれませんか?もちろん、あなたが設定可能な 'Comparator'を実装していない限り、私はそれがあなたが指していたものだとは思いません。 – Andreas

0

コンパレータと同等品は、2つの異なる目的を果たします。どちらも、目的の方法でオブジェクトを並べ替えるために使用されます。上記の場合、サイズと価格に基づいてテレビを並べ替える特定のケースのみを並べ替えることができます。将来的には あなたはそれが価格だけでソートしたい場合は...あなたは上記のアプローチではcompareToメソッドを変更する必要があります。しかし、その代わりに、あなたがCollections.sort(1,new PriceComparator())を使用してクラスを変更せずにテレビの要素を並べ替えることができますコンパレータインタフェースを書くことができます。希望これansの質問です。

関連する問題