2016-08-23 2 views
1

Если я следующий список студенческих объектов,функция сортировки в Java коллекции

obj1.Name = "ABC"; 
obj1.Rank = 5; 

obj2.Name = "DEF", 
obj2.Rank = 3; 

obj3.Name = "GHI"; 
obj3.Rank = 2; 

obj4.Name = "JKL"; 
obj4.Rank = 0; 

obj5.Name = "MNO"; 
obj5.Rank = 1; 

obj6.Name = "PQR"; 
obj6.Rank = 4; 

Мне нужно отсортировать эти объекты в следующем порядке.

obj5, 
obj3, 
obj2, 
obj6, 
obj1, 
obj4. 

Я попытался следующий код,

Collections.sort(studentList, new Comparator<Student>() { 
    @Override 
    public int compare(Student obj2, Student obj1) { 
      return obj2.Rank.compareTo(obj1.Rank); 
    } 
}); 

Я получаю следующий результат.

obj4,//this should be in last position 
obj5, 
obj3, 
obj2, 
obj6, 
obj1. 

Но мне нужно, чтобы все ноль должны были наконец. Любая помощь будет высоко оценена.

+0

Почему бы вам не установить ранг obj4 на «6»? –

ответ

2

лучший способ, чтобы отсортировать их с 0 выше, чем любое значение является:

Collections.sort(StudentList, new Comparator<Student>() { 
    @Override 
    public int compare(Student obj1, Student obj2) { 
     if(obj1.Rank==0) return (obj2.Rank==0) ? 0 : 1; 
     if(obj2.Rank==0) return -1; 
     return Integer.compare(obj1.Rank,obj2.Rank); 
    } 
}); 

Это правильно обработает случай, когда obj.Rank=Integer.MAX_VALUE.

Если ваши Rank s являются целыми, а не int s, вам также нужно будет обрабатывать корпус, где они находятся null.

+0

Благодарим вас за беспокойство 'Integer.MAX_VALUE'. +1. – Gunaseelan

1

Если вы хотите поместить 0 в последний порядок сортировки и оставить других в порядке возрастания (то есть: 1, 2, 3, 4, 5, 0), вам нужно будет написать обычай Comparator, который обрабатывает 0 в качестве наибольшее значение. Возможно, что-то вроде этого:

Collections.sort(StudentList, new Comparator<Student>() { 
    @Override 
    public int compare(Student obj1, Student obj2) { 
     Integer compareRank1 = obj1.Rank == 0 ? Integer.MAX_VALUE : obj1.Rank; 
     Integer compareRank2 = obj2.Rank == 0 ? Integer.MAX_VALUE : obj2.Rank; 
     return compareRank1.compareTo(compareRank2); 
    } 
}); 
+0

Конечно, это будет неудачно, если вы действительно имеете значение с рангом 'Integer.MAX_VALUE'. –

0

Вы можете редактировать сравнить метод, и положить чек на ноль

Collections.sort(studentList, new Comparator<Student>() { 

    @Override 
    public int compare(Student obj2, Student obj1) { 
    if(obj1.rank ==0){ 
     if(obj2.rank ==0){ 
      // when both count are zero then you can handle here 
     } 
     // return positive int beacuse zero is greater than everyother count 
     } 
    else return obj2.Rank.compareTo(obj1.Rank); 
    } 
}); 
Смежные вопросы