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>>

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

5
задан Rohit Banga 2 February 2010 в 12:30
поделиться

3 ответа

Укладчик описал, как исправить код, который вы показали. Вот как исправить код в своем комментарии: прежде всего, не используйте массивы, потому что массивы не работают с Generics (вы не можете иметь массив общего типа). Вместо этого вы можете использовать список и коллекции . SORT () Метод:

    List<Map.Entry<Integer, Double>> mList = 
        new ArrayList<Map.Entry<Integer, Double>>(Score.entrySet()); 
    Collections.sort(mList, new ScoreComp());
2
ответ дан 14 December 2019 в 04:37
поделиться
-

Как насчет переписывания как

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;
    }
}
2
ответ дан 14 December 2019 в 04:37
поделиться

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

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);

с элемента сам сопоставимо , вам не нужен внешний компаратор (если вы не хотите).

4
ответ дан 14 December 2019 в 04:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: