2012-01-01 35 views
3

私は以下のクラスを持っています。この中で、Irisはいくつかの属性を持つ別のクラスです。Javaで配列リストをソート

public class Helper { 

    Iris iris; 
    double distance; 

    public Helper(Iris iris, double distance) { 
     this.iris = iris; 
     this.distance = distance; 
    } 
} 

私は距離パラメータに基づいて降順、この(すなわち一覧<ヘルパー> helperList)の配列リストをソートしたいです。私は以下の方法を書いたが、うまくいかない。

public void sort(){ 
for(int k=0; k < helperList.size(); k++) 
     { 
      double distance = helperList.get(k).distance; 

      for(int l=0; l < helperList.size(); l++) 
      { 
       Helper temp = helperList.get(l); 
       if(distance < temp.distance) 
       { 
        helperList.set(l, helperList.get(k)); 
        helperList.set(k, temp); 
       } 
      } 
     } 
} 

誰でも解決策を提案できますか?

+0

どのように? –

+0

リストが適切にソートされていません。 – Ammar

+1

2つの要素、例えば '[1,2]'がどうなるかを考えてみましょう。 'list.get(1)> 1'のために 'k = 0、l = 1'の場合、スワップして' [2,1] 'を返します。次に、 'k = 1、l = 0'の場合、再び入れ替えます。各要素は片方の要素と比較するだけです。 –

答えて

17

HelperクラスにComparableインターフェイスを実装してから、Collectionsクラスが提供する組み込みソートメソッドを使用するのはなぜですか。

Collections.sort(helperList) 

私はこの問題を解決すると思います。プラス、このsortメソッドは安定しています。 Comparableインタフェースを実装

http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort%28java.util.List%29

http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

public class Helper implements Comparable{ 

    Iris iris; 
    double distance; 

    public Helper(Iris iris, double distance) { 
     this.iris = iris; 
     this.distance = distance; 
    } 

    public int compareTo(Helper other) { 
     return new Double(this.distance).compareTo(new Double(other.distance)); 

    } 
} 
+0

2つの距離が1未満の場合、このcompareTo実装は0を返します(正しくキャストする場合)。 return this.distance other.distance? 1:0; – jackrabbit

+0

ええ、ありがとう。私はすでに問題を修正しました。 – Divya

+0

それは動作します。 @Divyaへのすべての、そして特に彼女の提案のために、 – Ammar

0

Wikipediaのbubble sort上の記事では、擬似コードと、いくつかの最適化されたバージョンを含んでいます。あなたが間違っている場所を見るためにそのものと比較してください。

バブルソートは、最も明白なソートアルゴリズムの1つですが、正確には最も効率的ではありません。なぜあなたはプラットフォームに並べ替えをさせませんか? java.util.Collectionsには、を提供できるsortメソッドが含まれています。コンパレータが行う必要があるのは、2つのうちどれが最初に来るべきかを決めることだけです。

1

問題は、ループがスワップされた後に距離インデックスがどこにあるかのトラックを失うことです。このアルゴリズムは正常に動作するはずです。

for(int k = 1; k < helperList.size(); k++) { 
    double distance = helperList.get(k).distance; 
    int j = k - 1; 
    boolean done = false; 
    while(!done) { 
     Helper temp = helperList.get(j); 
     if(temp.distance < distance) { 
      helperList.set(j+1, temp); 
      j = j - 1; 
      if(j < 0) { 
       done = true; 
      } 
     } else { 
      done = true; 
     } 
     helperList.set(j+1, value); 
    } 
} 
+0

Thanx Shawn。私はCollections.sort(オブジェクト)をDivyaの提案どおりに使いました。 – Ammar

4

Divya's answerは良いですが、あなたはComparableインタフェースを実装したくない場合は、次のヘルプかもしれません:それは働いていない

Collections.sort(helperList, new Comparator<Helper>() { 
    public int compare(Helper helper1, Helper helper2) { 
     return Double.compare(helper1.distance, helper2.distance); 
    } 
}) 
+1

'helper1.distance-helper2.distance'はintではなくdoubleを返します。私は同じ間違いを犯した。 – Divya

+0

はい、そうです:) –

関連する問題