java - collections.sort(list, comparator) 使用比较器 DEBUG

标签 java sorting comparator

我正在尝试使用collections.sort(list, comparator)<Map.Entry<String, Integer>> 进行排序目的。代码编译正确,但在运行时出现以下错误。这是我第一次使用比较器和 collections.sort,但似乎无法找到代码中导致问题的原因。错误是说 Collections.sort(list, new WordCountComparator() );是问题的原因。我是否正确定义了比较器类?我是否正确使用了 > 泛型类型?

最初,我在 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);
        }
    }
}

}

最佳答案

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

关于java - collections.sort(list, comparator) 使用比较器 DEBUG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32576151/

相关文章:

java - 使用 HtmlUnit Java 打开来自 <a href> 的链接

java - Java 中的重复数据删除 API

java - 在javafx中按字母顺序选择节点

java - 通过我的应用程序删除驻留在内部 Linux 服务器上的文件

javascript - 按字母顺序组织 JSON 数据

c++ - 如何在不使用循环的情况下进行排序

java - 在 Java 中将字符串解析为比较器类型

python - 我需要根据元组中的元素是否相等,以不同的顺序对两个元组列表进行排序

java - 获取 TreeMap 中的三个最高值

Java 8 lambda : Comparator