java непроверенное приведение

У меня есть класс компаратора в Java для сравнения записей карты:

public class ScoreComp implements Comparator<Object> {

    public int compare(Object o1, Object o2) {

        Entry<Integer, Double> m1 = null;
        Entry<Integer, Double> m2 = null;

        try {
            m1 = (Map.Entry<Integer, Double>)o1;
            m2 = (Map.Entry<Integer, Double>)o2;
        } catch (ClassCastException ex){
            ex.printStackTrace();
        }

        Double x = m1.getValue();
        Double y = m2.getValue();
        if (x < y)
            return -1;
        else if (x == y)
            return 0;
        else
            return 1;        
     }

}

когда я компилирую эту программу, я получаю следующее:

warning: [unchecked] unchecked cast
found   : java.lang.Object
required: java.util.Map.Entry<java.lang.Integer,java.lang.Double>
            m1 = (Map.Entry<Integer, Double>)o1;

Мне нужно отсортировать записи карты на основе двойных значений.

Если я создам следующий компаратор, я получу ошибку в вызове функции сортировки массивов (я получаю набор записей с карты, а затем использую набор как массив).

public class ScoreComp implements Comparator<Map.Entry<Integer, Double>>

как реализовать этот сценарий.


person Rohit Banga    schedule 01.02.2010    source источник
comment
Что вы подразумеваете под использованием набора в качестве массива?   -  person pgras    schedule 01.02.2010
comment
см. комментарий под ответом укладчика   -  person Rohit Banga    schedule 01.02.2010
comment
Это не имеет ничего общего с исключениями; Я изменил заголовок и теги соответственно   -  person Michael Borgwardt    schedule 01.02.2010
comment
хоть ты и обновил вопрос, ссылка на вопрос не изменилась... лол   -  person Rohit Banga    schedule 01.02.2010
comment
здравствуйте, адрес изменился. Так как это работает. после того, как я отредактирую заголовок сообщения, старый URL-адрес вопроса перестанет работать.   -  person Rohit Banga    schedule 02.02.2010


Ответы (3)


stacker описал, как исправить код, который вы показали. Вот как исправить код в вашем комментарии: Прежде всего, не используйте массивы, потому что массивы не работают с дженериками (у вас не может быть массива универсального типа). Вместо этого вы можете использовать метод List и Collections.sort():

    List<Map.Entry<Integer, Double>> mList = 
        new ArrayList<Map.Entry<Integer, Double>>(Score.entrySet()); 
    Collections.sort(mList, new ScoreComp());
person Michael Borgwardt    schedule 01.02.2010
comment
как бы я хотел принять два ответа как правильные. ваш ответ хорош, но для своей работы я бы использовал подход Скаффмана. - person Rohit Banga; 02.02.2010

Предполагая, что вы используете этот компаратор для сортировки TreeMap, это не сработает. Компараторы TreeMap предназначены для сравнения только ключей карты, а не записей ключ->значение. Если вашему компаратору нужен доступ к значениям, ему придется искать их на самой карте, например.

final Map<Integer, Double> map = ....

public class ScoreComp implements Comparator<Integer>  {
   public int compare(Integer key1, Integer key2) {
    Double x = map.getValue();
    Double y = map.getValue();
    if (x < y)
        return -1;
    else if (x == y)
        return 0;
    else
        return 1; 
   }
}

изменить: Судя по вашим комментариям, лучше всего создать класс, который инкапсулирует идентификатор и значение, поместить эти значения в список и отсортировать их.

public class Item implements Comparable<Item> {
   int id;
   double value;

   public int compareTo(Item other) {
      return this.value - other.value;
   }
}

а потом

List<Item> list = new ArrayList<Item>();
// ... add items here
Collections.sort(list);

Поскольку Item сам по себе является Comparable, вам не нужен внешний Comparator (если только он вам не нужен).

person skaffman    schedule 01.02.2010
comment
что, если мне нужно отсортировать на основе значений, а значения не уникальны, поэтому ключи должны быть целыми числами, и я хочу сохранить ключ и значение вместе, чтобы мой код выглядел простым для понимания. - person Rohit Banga; 01.02.2010
comment
Вы действительно используете значения Integer для чего-либо? Кто не просто поместил двойников в список и отсортировал их? - person skaffman; 01.02.2010
comment
после сортировки двойных значений мне нужно определить, какое двойное значение принадлежит какому идентификатору. stackoverflow.com/questions/2145853 / - person Rohit Banga; 01.02.2010
comment
единственное, я не смог найти встроенную структуру парных данных. - person Rohit Banga; 02.02.2010
comment
stackoverflow.com/questions/156275/ - person Rohit Banga; 02.02.2010

Что насчет перезаписи как

public class ScoreComp implements Comparator<Map.Entry<Integer, Double>> {

    public int compare(Map.Entry<Integer, Double> o1, Map.Entry<Integer, Double> o2) {
        if ( o1.getValue()  < o2.getValue()  ) return -1;
        else if ( o1.getValue() == o2.getValue()  ) return 0;
        return 1;
    }
}
person stacker    schedule 01.02.2010
comment
то я получаю сообщение об ошибке при вызове sort. `Set‹Map.Entry‹Integer, Double›› mSet = Score.entrySet(); Объект[] arr = mSet.toArray(); Arrays.sort(arr, new ScoreComp());` - person Rohit Banga; 01.02.2010
comment
Нет, это не сработает, потому что подпрограммы TreeMap не будут передавать значения Map.Entry, как бы вы ни старались их скомпилировать. - person skaffman; 01.02.2010
comment
хорошо, код в моем вопросе компилировался с версией 6.5 NetBeans для Windows. но он не компилируется в netbeans 6.8 в linux. (java 1.6 на обоих - странно) - person Rohit Banga; 01.02.2010