我正在尝试使用collections.sort(list, comparator)
对<Map.Entry<String, Integer>>
对象进行排序。代码编译正确,但我在运行时遇到以下错误。这是我第一次使用比较器和collections.sort,但似乎无法找到导致代码问题的原因。错误是说Collections.sort(list, new WordCountComparator() );
是导致问题的原因。我是否正确定义了比较器类?我使用&gt;通用类型正确吗?
最初我在CLI上使用这些命令运行代码来编译,创建jar并运行:
javac MP1.java
jar cfe MP1.jar MP1 MP1.class
java -jar MP1.jar 1
并收到此错误:
Exception in thread "main" java.lang.NoClassDefFoundError: MP1$WordCountComparator
at MP1.process(MP1.java:112)
at MP1.main(MP1.java:132)
Caused by: java.lang.ClassNotFoundException: MP1$WordCountComparator
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 2 more
我尝试使用以下命令运行代码而不创建jar文件:
javac MP1.java
java MP1 1
这是出现的错误
Exception in thread "main" java.lang.NullPointerException
at java.lang.Integer.compareTo(Integer.java:1003)
at MP1$WordCountComparator.compare(MP1.java:15)
at MP1$WordCountComparator.compare(MP1.java:12)
at java.util.TimSort.countRunAndMakeAscending(TimSort.java:325)
at java.util.TimSort.sort(TimSort.java:203)
at java.util.TimSort.sort(TimSort.java:173)
at java.util.Arrays.sort(Arrays.java:659)
at java.util.Collections.sort(Collections.java:217)
at MP1.process(MP1.java:112)
at MP1.main(MP1.java:132)
整个MP1.java文件的代码是:
import java.lang.reflect.Array;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import java.io.*;
public class MP1 {
private static class WordCountComparator implements Comparator<Map.Entry<String, Integer>> {
public int compare( Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2 )
{
if(o2.getValue().compareTo( o1.getValue()) != 0) {
return o2.getValue().compareTo(o1.getValue());
}
else {
return o1.getKey().compareTo(o2.getKey());
}
}
}
Random generator;
String userName;
String inputFileName;
String delimiters = " \t,;.?!-:@[](){}_*/";
String[] stopWordsArray = {"i", "me", "my", "myself", "we", "our", "ours", "ourselves", "you", "your", "yours",
"yourself", "yourselves", "he", "him", "his", "himself", "she", "her", "hers", "herself", "it", "its",
"itself", "they", "them", "their", "theirs", "themselves", "what", "which", "who", "whom", "this", "that",
"these", "those", "am", "is", "are", "was", "were", "be", "been", "being", "have", "has", "had", "having",
"do", "does", "did", "doing", "a", "an", "the", "and", "but", "if", "or", "because", "as", "until", "while",
"of", "at", "by", "for", "with", "about", "against", "between", "into", "through", "during", "before",
"after", "above", "below", "to", "from", "up", "down", "in", "out", "on", "off", "over", "under", "again",
"further", "then", "once", "here", "there", "when", "where", "why", "how", "all", "any", "both", "each",
"few", "more", "most", "other", "some", "such", "no", "nor", "not", "only", "own", "same", "so", "than",
"too", "very", "s", "t", "can", "will", "just", "don", "should", "now"};
void initialRandomGenerator(String seed) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance("SHA");
messageDigest.update(seed.toLowerCase().trim().getBytes());
byte[] seedMD5 = messageDigest.digest();
long longSeed = 0;
for (int i = 0; i < seedMD5.length; i++) {
longSeed += ((long) seedMD5[i] & 0xffL) << (8 * i);
}
this.generator = new Random(longSeed);
}
Integer[] getIndexes() throws NoSuchAlgorithmException {
Integer n = 10000;
Integer number_of_lines = 50000;
Integer[] ret = new Integer[n];
this.initialRandomGenerator(this.userName);
for (int i = 0; i < n; i++) {
ret[i] = generator.nextInt(number_of_lines);
}
return ret;
}
public MP1(String userName, String inputFileName) {
this.userName = userName;
this.inputFileName = inputFileName;
}
public String[] process() throws Exception {
String[] ret = new String[20];
File file = new File(this.inputFileName);
Scanner scanner = new Scanner(file);
String[] lines = new String[50000];
int i = 0;
while(scanner.hasNextLine()){
lines[i] = scanner.nextLine();
i++;
}
Integer[] indices = getIndexes();
String[] records = new String[10000];
//ArrayList<String> words = new ArrayList<String>();
Map<String, Integer> wordCount = new HashMap<String, Integer>();
i = 0;
for(Integer index:indices){
records[i] = lines[index].toLowerCase().trim();
StringTokenizer tokenOfString = new StringTokenizer(records[i], this.delimiters);
i++;
while(tokenOfString.hasMoreTokens()){
String token = tokenOfString.nextToken();
if(!Arrays.asList(stopWordsArray).contains(token)){
if(wordCount.get(token) == null) {
wordCount.put(token,1);
}
else{
wordCount.put(token, wordCount.get(token + 1));
}
}
}
}
List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(wordCount.entrySet());
Collections.sort(list, new WordCountComparator() );
for (i = 0; i < 20; i++ ){
ret[i] = list.get(i).getKey() + "\t" + Integer.toString(list.get(i).getValue());
}
return ret;
}
public static void main(String[] args) throws Exception {
if (args.length < 1){
System.out.println("MP1 <User ID>");
}
else {
String userName = args[0];
String inputFileName = "/home/unknown/git/cloudapp-mp1/input.txt";
MP1 mp = new MP1(userName, inputFileName);
String[] topItems = mp.process();
for (String item: topItems){
System.out.println(item);
}
}
}
}
答案 0 :(得分:1)
我猜你在构建jar文件时错过了MP1$WordCountComparator.class
。
答案 1 :(得分:0)
相反
jar cfe MP1.jar MP1 MP1.class
你必须使用
jar cfe MP1.jar MP1 MP1.class MP1\$WordCountComparator.class