2015-09-15 4 views
1

Я пытаюсь использовать collections.sort(list, comparator), чтобы отсортировать объект <Map.Entry<String, Integer>>. Код компилируется правильно, но во время выполнения я получаю следующую ошибку. Это мой первый раз с использованием компаратора и collection.sort, но, похоже, не может найти то, что вызывает проблему в коде. Ошибка говорит о том, что причиной является проблема Collections.sort(list, new WordCountComparator());. Я правильно определил класс компаратора? Я правильно использую> общий тип?collections.sort (список, компаратор) с использованием компаратора DEBUG

Сначала я побежал код, используя эти команды на CLI для complile, создать банку и выполнить команду:

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 

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

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

Сколько '.java' исходные файлы у вас есть и как вы строите свой код? –

+0

Это похоже на проблему сборки. – dasblinkenlight

+0

У меня есть весь код в одном файле .java и для запуска в командной строке: javac MP1.java, jar cfe MP1.jar MP1 MP1.class, java -jar MP1.jar 1. Он разбивается на последний команда. – stochasticcrap

ответ

1

Я думаю, в то время как создать свой файл банку, вы пропустили MP1$WordCountComparator.class.

+0

Что такое MP1 $ WordCountComparator.class, и что мне с ним делать? – stochasticcrap

+0

У вас есть внутренний класс в вашем коде под названием 'WordCountComparator', который вы передаете как компаратор в свой вызов' sort() '. Вы как-то пропустили, чтобы скопировать этот файл класса или не смогли включить его при создании jar. –

+0

Что вы имеете в виду, пропустив, чтобы скопировать файл класса и не смог включить его при создании jar? Я не знаком с java. Мой внутренний класс находится в том же файле, что и остальная часть кода для программы, которая находится в MP1.java. – stochasticcrap

0

Вместо

jar cfe MP1.jar MP1 MP1.class 

Вы должны использовать

jar cfe MP1.jar MP1 MP1.class MP1\$WordCountComparator.class 
Смежные вопросы