2012-04-24 11 views
0

arrayListを2つの異なる方法で並べ替えようとしています.1つはarrayList内のオブジェクトの領域で、もう1つは名前(shape1、shape2) arrayList内のオブジェクトオブジェクトをファイルに印刷すると、オブジェクトは次のようになります。shape1:(点、半径など...)area = 0.0と形状がそのまま続く。私は似ているが、すべてCollections.sortを使って答えた他の質問された質問を見てみました。私はこの方法を使用しているはずです。オブジェクトのarrayListをJavaのコンポーネントで並べ替えるには

for (int i =0; i <shapes.size();i++){ 
    for (int j = 1; j<shapes.size(); j++){ 
     if (shapes.get(i).getShape().area() > shapes.get(j).getShape().area()) 
     { 
      // 
     } 
     else 
     { 
      // 
     } 
    } 
} 

私はこれをどうやってやるべきか分かりません。すべてのポインタ?私が使用する必要が名前でソートするため:

shapes.get(i).getName() 

答えて

1

これは宿題なので、私はコードを投稿しません。

Arrays.sortを使用することができない場合は、Selection Sortを実装できます。これは非常に簡単で、コードの初めには既に書かれています。内側のループをjにしてiからshapes.size()へのセグメント内の最小要素を選択し、その要素を配列のi番目に配置するという考え方は、iの外側ループの繰り返しごとに行われます。あなたの内部ループは次のようになります。

for(int j = i+1 ; j<shapes.size(); j++) 
//   ^--- this is what's changed 

は、今すぐあなたのif条件にi番目といずれかのスワップj番目の要素に基づく、または場所に保管し、上に移動します。

文字列をソートするには、ifの条件でcompareToメソッドを使用します。

+0

どのようにi番目の位置に配置するのですか? .add?または.set? – Milwaukoholic

+0

@Milwaukoholic 'set'を使用してください。古典的なスワップは次のようになります: 'Shape tmp = shapes.get(i); shapes.set(i、shapes.get(j)); shapes.set(j、tmp); ' – dasblinkenlight

3

ソリューション1

あなたのオブジェクトは、Comparableインタフェースを実装してソートするCollections.sort(List list)を使用することができます。

public class Shape implements Comparable<Shape> { 
    @Override 
    public int compareTo(Shape o) { 
     if(o == null) { 
      return 1; 
     } 
     if(getName() == null || o.getName() == null) { 
      return 0; 
     } else if(getName() != null && o.getName() == null) { 
      return 1; 
     } else if(getName() == null && o.getName() != null) { 
      return -1; 
     } 
     return getName().compareTo(o.getName()); 
    } 
} 

Collections.sort(shapes); 

ソリューション2

私はあなたがこのようなものを使用すべきだと思うComparatorを実装するクラスを作成し、Collections.sort(List list, Comparator c)

public class ShapeComparator implements Comparator<Shape> { 
    @Override 
    public int compare(Shape s1, Shape s2) { 
     if(s1 == null || s2 == null) { 
      return 0; 
     } else { 
      return s1.getName().compareTo(s2.getName()); 
     } 
    } 
} 

Collections.sort(shapes, new ShapeComparator()); 
+0

私はあなたの' Comparable'実装を無効にしました。あなたがその「強いタイピング」ナンセンスで話していたことが(私が推測している)ジェネリックタイプパラメータがありませんでした。つまり、どちらの実装も、左側のgetName()呼び出しが 'null'を返すケースを処理しません。それはNPEだろう。 –

0

を使用:多くのため

 Collections.sort(shapes, new Comparator<Object>() { 
      public int compare(Object obj1, Object obj2) { 
       Shape shape1 = ((Shape) obj1).getShape(); 
       Shape shape2 = ((Shape) obj2).getShape(); 

       String name1 = ((Shape) obj1).getName(); 
       String name2 = ((Shape) obj1).getName(); 

       Double area1 = shape1.area(); 
       Double area2 = shape2.area(); 

       int areaCmp = area1 - area2; 
       if(areaCmp!= 0) { 
        return areaCmp; 
       } 

       return name1.compareTo(name2); 
      } 
     }); 

関連する問題