2012-04-24 94 views
0

我想排序arrayList以兩種不同的方式,一個由arrayList內的對象的區域和兩個,由名稱(形狀1,形狀2)的arrayList中的對象。當我將它們打印到一個文件中時,這些對象看起來像這樣:shape1 :(點,半徑等...)area = 0.0並且形狀繼續。我試着查看其他類似的問題,但都使用Collections.sort進行了解答。我不知道我應該使用這種方法。這裏有一些代碼,我正在努力給你一個想法:如何排序在java中的組件對象的arrayList

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 - 這非常簡單,並且您已經將其開始寫入代碼中。這個想法是在i的外循環的每次迭代上從ishapes.size()使用j的內循環挑選段中最小的元素,並將該元素放置在數組的第i位置。你的內循環應該是這樣的:

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

現在,根據您的病情ifi個或者交換j個元素,或保持在適當位置,繼續前進。

對於排序字符串,請在if條件中使用compareTo方法。

+0

我該如何把它放在第i個位置? 。加?或.set? – Milwaukoholic 2012-04-24 03:51:48

+0

@Milwaukoholic使用'set'。經典的交換是這樣的:'Shape tmp = shapes.get(i); shapes.set(i,shapes.get(j)); shapes.set(j,tmp);' – dasblinkenlight 2012-04-24 03:54:35

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。 – 2012-04-24 04:04:45

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); 
      } 
     }); 

更多info