2015-06-28 1 views
-2

У меня есть это:Общие предупреждения Компаратор

import java.util.*; 
import java.io.*; 

class MyComparator<K,V> implements Comparator<Map.Entry<K,List<V>>> { 

    public int compare(Map.Entry<K,List<V>> me1, Map.Entry<K,List<V>> me2) { 

       List<V> v1 = me1.getValue(); 
       List<V> v2 = me2.getValue(); 

       if(v1.size() > v2.size()) 
        return 1; 
       else if(v1.size() < v2.size()) 
        return -1; 
       else 
        return 0; 
    } 
} 

public class Anagrams1 { 
    public static void main(String[] args) { 
     int minGroupSize = Integer.parseInt(args[1]); 

     // Read words from file and put into a simulated multimap 
     Map<String, List<String>> m = new HashMap<String, List<String>>(); 

     try { 
      Scanner s = new Scanner(new File(args[0])); 
      while (s.hasNext()) { 
       String word = s.next(); 
       String alpha = alphabetize(word); 
       List<String> l = m.get(alpha); 
       if (l == null) 
        m.put(alpha, l=new ArrayList<String>()); 
       l.add(word); 
      } 
     } catch (IOException e) { 
      System.err.println(e); 
      System.exit(1); 
     } 

     // Print all permutation groups above size threshold 
     Collection<Map.Entry<String,List<String>>> c = m.entrySet(); 
     Object[] arr = c.toArray(); 
     Arrays.sort(arr, new MyComparator()); 
     for(Object o : arr) { 
      if(m.get(o).size() >= minGroupSize) 

       System.out.println(o + " : " + m.get(o).size() + ": " + m.get(o)); 

     } 
    } 

    private static String alphabetize(String s) { 
     char[] a = s.toCharArray(); 
     Arrays.sort(a); 
     return new String(a); 
    } 
} 

Это дает мне два предупреждения:

javacode$ javac -Xlint:unchecked Anagrams1.java 

    Anagrams1.java:45: warning: [unchecked] unchecked method invocation: method sort in class Arrays is applied to given types 
      Arrays.sort(arr, new MyComparator()); 

        ^
    required: T[],Comparator<? super T> 

    found: Object[],MyComparator 

    where T is a type-variable: 

     T extends Object declared in method <T>sort(T[],Comparator<? super T>) 

    Anagrams1.java:45: warning: [unchecked] unchecked conversion 

      Arrays.sort(arr, new MyComparator()); 

         ^
    required: Comparator<? super T> 

    found: MyComparator 

    where T is a type-variable: 

     T extends Object declared in method <T>sort(T[],Comparator<? super T>) 

Помощь нужна. Благодарю.

+1

Ну, так как это третий вопрос (включая удаленный) о дженериках и (почти) одном и том же коде: вы когда-нибудь читали о дженериках? Как они работают и как их можно использовать? – Tom

+0

@Tom Я прочитал учебник, и я читаю его снова. Я чувствовал, что получить советы от людей в дополнение к моему чтению будет хорошим и быстрым способом учиться. В настоящее время я читаю это: http://docs.oracle.com/javase/tutorial/extra/generics/subtype.html – abc

ответ

1

Есть два подхода к этому, что я предлагаю:

  1. Используйте Collection#toArray(T[]), чтобы получить массив элементов типа T[]. Это сложно и нехорошо, потому что вам нужно будет T быть Map.Entry<K,List<V>>, и вы не можете создать один из них напрямую, так как generics - невосстанавливаемые типы.
  2. Скопируйте элементы в ArrayList (например, используя new ArrayList<>(m.entrySet())), а затем позвоните по телефону Collections.sort.

Последний был бы моим предпочтительным подходом, так как коллекции имеют преимущества безопасности в отношении простых массивов.

+0

", и вы не можете создать один из них напрямую, так как generics - невосстанавливаемые типы." Что это значит ? Не могли бы вы объяснить в упрощенном виде? – abc

+0

http://stackoverflow.com/questions/2927391/whats-the-reason-i-cant-create-generic-array-types-in-java –

1

Вы определили class MyComparator<K,V>.

Вы звоните new MyComparator(). С Object[].

Это должно дать вам точное предупреждение, которое оно дает вам - ожидается, что он будет определен new MyComparator<String, String>() на основе вашего кода.

Я также рекомендую перейти в правильно напечатанном List вместо Object[] в качестве первого аргумента и вместо этого использовать Collections.sort.

1

Это еще даст вам предупреждение в уступке Map.Entry[] к Map.Entry<String,List<String>>[], но Arrays.sort вызов не даст никакого предупреждения:

Map.Entry<String,List<String>>[] arr = c.toArray(new Map.Entry[0]); 
    Arrays.sort(arr, new MyComparator<String,String>()); 

Я не думаю, что вы можете уйти с этим предупреждением если вы хотите использовать массив для сортировки, поскольку вы не можете создать экземпляр общего массива, поэтому c.toArray(new Map.Entry<String,List<String>>[0]) не будет передавать компиляцию.

+0

Использование 'Collections.sort' устранит необходимость использования массива (и это дополнительное предупреждение) – Krease

+0

Я не смог скомпилировать после изменений: javacode $ java Anagrams1 ./dictionary.txt 8 Исключение из потока "main" java.lang.ClassCastException: [Ljava.lang.Object; не может быть применено к [Ljava.util.Map $ Entry; \t at Anagrams1.main (Anagrams1.java:44) Попытка Коллекции. – abc

+0

Почему я не могу сделать бросок, почему ошибка, как указано выше? – abc

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