2012-04-24 2 views
0

Я пытаюсь сортировать массивList двумя разными способами: по областям объектов внутри arrayList и по имени (shape1, shape2) объекты в списке arrayList. Объекты выглядят так, когда я печатаю их в файл: shape1: (точки, радиус и т. Д.) Area = 0.0, и формы продолжаются. Я попробовал посмотреть на другие заданные вопросы, похожие, но все ответили с помощью Collections.sort. Я не уверен, что должен использовать этот метод. Вот код, с которым я работаю, чтобы дать вам идею:Как отсортировать массивList объектов по их компонентам в 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 - это очень просто, и у вас уже начаты его написания в вашем коде. Идея заключается в каждой итерации внешнего цикла на i, чтобы выбрать наименьший элемент в сегменте от i до shapes.size(), используя внутренний цикл на j, и поместите этот элемент на i -е место вашего массива. Ваш внутренний цикл должен выглядеть следующим образом:

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

Теперь на основе вашего if состояния вы либо замены j -го элемент с i -й, или держать его на месте и двигаться дальше.

Для сортировки строк используйте метод compareTo в вашем if условиях.

+0

Как мне разместить его в i-й позиции? .Добавить? или .set? – Milwaukoholic

+0

@Milwaukoholic Используйте 'set'. Классический своп выглядит следующим образом: 'Shape tmp = shapes.get (i); shape.set (i, shapes.get (j)); forms.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()' call возвращает '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); 
      } 
     }); 

более info

Смежные вопросы