2013-09-28 4 views
3

У меня есть настраиваемый тип Position(x,y,z), теперь я создаю ArrayList<Position>, я хочу отсортировать этот массив, упорядоченный по значению z, от малого до большего, как я могу это сделать, используя Collections.sort или есть ли другой эффективный метод сортировки?Java: Как отсортировать пользовательский тип ArrayList

Когда я пытаюсь использовать

public class PositionComparator implements Comparator<Position> { 

     @Override 
     public int compare(Position o1, Position o2) { 
      // TODO Auto-generated method stub 
      return o1.height().compareTo(o2.height()); 

     } 

    } 

получите ошибку

Cannot invoke compareTo(double) on the primitive type double 
+0

возможным дубликат [Сортировка ArrayList лица с коллекцией java s] (http://stackoverflow.com/questions/12771534/sorting-an-arraylist-of-person-with-java-collections) –

+0

@Rohit Jain, если мой z является двойным типом, я получаю сообщение об ошибке «Can not invoke compareTo (double) для примитивного типа double' – atom2ueki

+0

try, return (int) (o1.height - o2.height()); – upog

ответ

0

вам нужно реализовать свой Comparator, который будет сравнить значение атрибута z.

7

попробовать

Collections.sort(SortList, new Comparator<Position>(){ 
      public int compare(Position p1, Position p2) { 
       return p1.z- p2.z; 
      } 
     }); 
5
Collections.sort 

, например

class User { 

    String name; 
    String age; 

    public User(String name, String age) { 
     this.name = name; 
     this.age = age; 
    } 

    public String getAge() { 
     return age; 
    } 

    public void setAge(String age) { 
     this.age = age; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 
import java.util.Comparator; 

public class ComparatorUser implements Comparator { 

    public int compare(Object arg0, Object arg1) { 
     User user0 = (User) arg0; 
     User user1 = (User) arg1; 

     int flag = user0.getAge().compareTo(user1.getAge()); 
     if (flag == 0) { 
      return user0.getName().compareTo(user1.getName()); 
     } else { 
      return flag; 
     } 
    } 

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

public class SortTest { 

    public static void main(String[] args) { 
     List userlist = new ArrayList(); 
     userlist.add(new User("dd", "4")); 
     userlist.add(new User("aa", "1")); 
     userlist.add(new User("ee", "5")); 
     userlist.add(new User("bb", "2")); 
     userlist.add(new User("ff", "5")); 
     userlist.add(new User("cc", "3")); 
     userlist.add(new User("gg", "6")); 

     ComparatorUser comparator = new ComparatorUser(); 
     Collections.sort(userlist, comparator); 

     for (int i = 0; i < userlist.size(); i++) { 
      User user_temp = (User) userlist.get(i); 
      System.out.println(user_temp.getAge() + "," + user_temp.getName()); 
     } 

    } 
} 
2

Я использую это (просто пример вырезать и прошлое, но та же идея) для сортировки по убыванию:

@Override 
public int compare(Member m1, Member m2) { 

    double fit1 = m1.getFitness() ; 
    double fit2 = m2.getFitness() ; 
    if (fit2>fit1) 
      return 1; 
    else if (fit2<fit1) 
      return -1; 
    else 
      return 0; 
} 
Смежные вопросы