简体   繁体   English

使用比较器DEBUG的collections.sort(list,比较器)

[英]collections.sort(list, comparator) using comparator DEBUG

I am trying to use collections.sort(list, comparator) to sort a <Map.Entry<String, Integer>> object. 我正在尝试使用collections.sort(list, comparator)<Map.Entry<String, Integer>>对象进行排序。 The code compiles correctly, but I get the following error during runtime. 代码可以正确编译,但是在运行时出现以下错误。 This is my first time using a comparator and collections.sort, but cannot seem to find what is causing the problem in the code. 这是我第一次使用比较器和collections.sort,但似乎无法找到导致问题的原因。 The error is saying that Collections.sort(list, new WordCountComparator() ); 错误是说Collections.sort(list, new WordCountComparator() ); is the cause of the problem. 是问题的原因。 Did I define the comparator class correctly? 我是否正确定义了比较器类? Am I using the > generic type correctly? 我是否正确使用了>泛型类型?

Initially I ran the code using these commands on the CLI to complile, create jar, and run: 最初,我在CLI上使用以下命令运行代码以编译,创建jar并运行:

javac MP1.java
jar cfe MP1.jar MP1 MP1.class
java -jar MP1.jar 1

And receive this error: 并收到此错误:

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

I tried running the code without creating a jar file by using these commands: 我尝试使用以下命令运行代码而不创建jar文件:

javac MP1.java
java MP1 1

and this is the error that appears 这是出现的错误

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)

The code for the entire MP1.java file is : 整个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);
        }
    }
}

} }

我猜在构建jar文件时,您错过了MP1$WordCountComparator.class

Instead 代替

jar cfe MP1.jar MP1 MP1.class

You have to use 你必须用

jar cfe MP1.jar MP1 MP1.class MP1\$WordCountComparator.class

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM