2015-04-08 2 views
0

Я пытаюсь сортировать карту на основе различных возможных значений в объекте Student. Кажется, это не работает для меня, и я не могу понять, почему. Любая помощь будет очень оценена. Благодаря!Попытка сортировать карту, где значение является объектом, и я могу сортировать по нескольким значениям в объекте

protected static Map<Integer, Student> sort(Map<Integer, Student> unsorterMap, String field) 
{ 
    Comparator<Integer> valueComparator = 
      new Comparator<Integer>() 
      { 
       public int compare(Integer k1, Integer k2) 
       { 
        int compare; 
        if(field.equalsIgnoreCase("name")) 
        { 
         compare = unsorterMap.get(k1).getName().compareTo(unsorterMap.get(k2).getName()); 
        } 
        else 
        { 
         compare = Integer.compare(unsorterMap.get(k1).getIndex(), unsorterMap.get(k2).getIndex()); 
        } 


        if (compare == 0) 
         return 1; 
        else 
         return compare; 
       } 
      }; 

    Map<Integer, Student> sortedMap = new TreeMap <Integer, Student>(valueComparator); 
    sortedMap.putAll(unsorterMap); 
    return sortedMap; 
} 
+1

Если вы хотите для сравнения 'Student', ваша реализация' Comparator' должна использовать 'Student' как параметр типа, а не' Integer' ... ('Integer' уже реализует' Comparable') –

+0

Также см. [этот вопрос] (http: //stackoverflow.com/questions/2864840/treemap-sort-by-value). –

+0

Спасибо за быстрый ответ. Я не понимаю, почему я бы использовал ученика вместо ключа. Пытаясь попробовать, что вы сказали, я столкнулся с проблемой. Конструктор TreeMap (Comparator ) undefined Map sortedMap = new TreeMap (valueComparator); – urbill

ответ

0

Ваш компаратор нарушает договор Comparator. От javadoc:

реализатор должен гарантировать, что SGN (ср (х, у)) == -sgn (ср (у, х)) для всех х и у

Но в вашем коде , у вас есть

if (compare == 0) 
    return 1; 
else 
    return compare; 

Если два студента имеет одинаковое значение для поля вы используете, чтобы сделать сравнение, как compare(x,y) и compare(y,x) возвратят 1.

+0

Спасибо, это не сортировка неправильно, это не сортировка вообще. Я получаю ту же карту, что и в. Я попробовал ее с возвратом сравнения, и это все равно ничего не меняет. – urbill

+0

@urbill у вас есть образец карты, которая не сортируется правильно? – Misha

+0

[вот карта, просто замените ученика для автора. Ключ = к индексу в объекте автора.] (Http://imgur.com/zKoeNI6) – urbill

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