Запутался, как набирать компаратор в другом классе - PullRequest
3 голосов
/ 24 января 2012

Я пытаюсь отсортировать значения двух LinkedHashMap. Я могу скомпилировать его и просто выполнить код, но он говорит мне использовать опцию -Xlint во время компиляции, потому что это небезопасный код. Это как-то связано с типами приведения типов, но я по-королевски растерялся, как это сделать. Я получил этот класс, который я положил в своем классе:

static class MyComparator implements Comparator {

        public int compare(Object obj1, Object obj2){
            int result=0;
            Map.Entry e1 = (Map.Entry)obj1 ;
            Map.Entry e2 = (Map.Entry)obj2 ;//Sort based on values.

            Integer value1 = (Integer)e1.getValue();
            Integer value2 = (Integer)e2.getValue();

            if(value1.compareTo(value2)==0){

                String word1=(String)e1.getKey();
                String word2=(String)e2.getKey();

                //Sort String in an alphabetical order
                result=word1.compareToIgnoreCase(word2);

            } else {
                //Sort values in a descending order
                result=value2.compareTo( value1 );
            }

            return result;
        }

    }

Я попытался вызвать его в одной из своих функций с помощью:

ArrayList myArrayList=new ArrayList(this.map_freq_by_date.entrySet());
Collections.sort(myArrayList, new MyComparator());
Iterator itr=myArrayList.iterator();

Примечание: this.map_freq_by_date определяется следующим образом:

Map<String,Integer> map_freq_by_date = new LinkedHashMap<String,Integer>();

Ошибка, которую я получаю с опцией -Xlint:

unchecked call to ArrayList(java.util.Collection<? extends E>) as a member of the raw type java.util.ArrayList
ArrayList myArrayList=new ArrayList(this.map_freq_by_date.entrySet());


unchecked conversion
found LogGrep.MyComparator
required: java.util.Comparator(? super T>
    Collections.sort(myArrayList, new MyComparator());

unchecked method invocation: <T>sort(java.util.List<T>,java.util.Comparator<? super T> in java.util.Collections is applied to (java.util.ArrayList,LogGrep.MyComparator)
    Collections.sort(myArrayList, new MyComparator());

Помощь в том, как это исправить, будет признателен. Я посмотрел в Интернете и попробовал все, что было показано, но я не могу понять, как это правильно.

Примечание: если я поставлю ArrayList<Object> myArrayList = new ArrayList<Object> ... ошибка изменится на:

unchecked method invocation <T>sort(java.util.List<T>,java.util.Comparator<> super T?) in java.util.Collections is applied ot (java.util.ArraList<java.lang.Object>,LogGrep.MyComparator)
        Collections.sort(myArrayList, new MyComparator());

Ответы [ 3 ]

4 голосов
/ 24 января 2012

Comparator является универсальным интерфейсом. Сделайте это так:

static class MyComparator implements Comparator<Map.Entry<String, Integer>> {
    public int compare(Map.Entry<String, Integer> obj1, Map.Entry<String, Integer> obj2){
        ...
    }
}

и определите ваш список как

List<Map.Entry<String, Integer>> myArrayList = new ArrayList<Map.Entry<String, Integer>>()

И компилятор снова будет счастлив.

Прочтите Обобщающее руководство для получения дополнительной информации. Или Общие вопросы об Анжелике Лангер .

Кстати, если ваш Comparator не нуждается в параметрах времени выполнения или имеет изменяемое состояние, вы должны определить его как константу вместо создания нового экземпляра для каждого вызова

0 голосов
/ 24 января 2012

Вы можете сделать это безопасным способом, как указано ниже:

Map<String, Integer> map = new LinkedHashMap<String, Integer>();
map.put("four", 4);
map.put("one", 1);
map.put("five", 5);
map.put("three", 3);
map.put("two", 2);

System.out.println(map);

List<Map.Entry<String, Integer>> entryList = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());        
Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() {
    @Override
    public int compare(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2) {
        return e1.getValue().compareTo(e2.getValue());
    }            
});        
map.clear();        
for(Map.Entry<String, Integer> e : entryList) {
    map.put(e.getKey(), e.getValue());
}

System.out.println(map);

Вывод:

{four=4, one=1, five=5, three=3, two=2}
{one=1, two=2, three=3, four=4, five=5}
0 голосов
/ 24 января 2012

Вы должны использовать Comparator<T> интерфейс, а не необработанный Comparator.

Читать эту статью .

...