У меня есть класс компаратора в 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>>
как реализовать этот сценарий.
Укладчик описал, как исправить код, который вы показали. Вот как исправить код в своем комментарии: прежде всего, не используйте массивы, потому что массивы не работают с Generics (вы не можете иметь массив общего типа). Вместо этого вы можете использовать список
и коллекции . SORT ()
Метод:
List<Map.Entry<Integer, Double>> mList =
new ArrayList<Map.Entry<Integer, Double>>(Score.entrySet());
Collections.sort(mList, new ScoreComp());
Как насчет переписывания как
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;
}
}
Предполагая, что вы используете этот компаратор для сортировки 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);
с элемента
сам сопоставимо
, вам не нужен внешний компаратор
(если вы не хотите).