我有这个:
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>)
需要帮助。感谢。
答案 0 :(得分:1)
您已定义class MyComparator<K,V>
。
您正在呼叫new MyComparator()
。使用Object[]
。
这应该会给你提供给你的确切警告 - 期望根据你的代码定义new MyComparator<String, String>()
。
我还建议传入正确输入的List
而不是Object[]
作为第一个参数,并使用Collections.sort
代替。
答案 1 :(得分:1)
我建议采用两种方法:
T[]
类型元素的数组。这很棘手,因为您需要T
成为Map.Entry<K,List<V>>
,并且您无法直接创建其中一个,因为泛型是不可重复的类型。ArrayList
(例如使用new ArrayList<>(m.entrySet())
),然后在其上调用Collections.sort
。后者是我的首选方法,因为Collections比普通数组具有类型安全优势。
答案 2 :(得分: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])
赢了& #39; t通过编译。