有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将txt文档预处理为以字符串为键、整数ArrayList为值的hashmap

为了完成一项作业,我被要求将一个txt文档预处理成一个hashmap,以便有一个高效的单词搜索功能。为了实现高效的单词搜索,您的代码将对文档进行预处理,并将文档中找到的所有单词以及它们在哈希表中找到的行(单词是键,行是值)我一辈子都搞不懂为什么我不能用一个新值替换一个键中的旧值。这是预处理文档的构造函数

HashMap<String, ArrayList<Integer>> map = new HashMap<String, ArrayList<Integer>>();

public wordSearch() {
    char charChecker;
    String word;
    ArrayList<Integer> count = new ArrayList<Integer>();
    try{
        URL url = new URL("http://homes.soic.indiana.edu/classes/spring2016/csci/c343-yye/docu.txt");
        Scanner in = new Scanner(url.openStream());
        int lineNumber = 1;
        while(in.hasNext()) {
            String str = in.nextLine();
            for(int i = 0; i < str.length(); i++) {
                for(int j = i+1; j < str.length(); j++) {
                    charChecker = str.charAt(j);
                    //check for word 
                    if(charChecker == ' ' ||
                       charChecker == ',' || 
                       charChecker == '.' ||
                       charChecker == '\n') {
                            word = str.substring(i, j);
                            //if word is already in HashMap
                            if(this.map.containsKey(word)) {
                                count = this.map.get(word);
                                count.add(lineNumber);
                                //System.out.println("[" + word + ", " + count.toString() + "]");
                                this.map.put(word, count);
                            }
                            //otherwise add word to HashMap
                            else {
                                count.add(lineNumber);
                                System.out.println(count.toString());
                                this.map.put(word, count);
                                //System.out.println("[" + word + ", " + count.toString() + "]");
                            }
                            i = j+1;
                            count.clear();
                    }
                }
            }
            lineNumber+=1;
        }
    in.close();
    }catch(IOException e) {
        System.out.println(e.getMessage());
    }
    System.out.println(this.map.toString());
}

如果您有任何关于从这里出发的建议,我们将不胜感激


共 (2) 个答案

  1. # 1 楼答案

    使用count = new ArrayList<Integer>();代替count.clear();

    现有代码对所有键具有相同的计数实例

  2. # 2 楼答案

    另一种方法是检查一个单词的行号是否存在

    HashMap<String, List<Integer>> wordMap = new HashMap<>();
    List<Integer> lineNumbers;
    
    if(...){
        word = str.substring(i, j);
        if ((lineNumbers = wordMap.get(word)) != null){
            lineNumbers.add(lineNumber);
        }else {
            lineNumbers = new ArrayList<>();
            lineNumbers.add(lineNumber);
            wordMap.put(word, lineNumbers);
        }
        i = j+1
    }