获取文件中出现的单词并将其与出现次数一起存储

时间:2015-01-21 03:30:37

标签: java file-io

我正在尝试读取文件中每个单词的出现次数,并将其存储在带有出现次数的散列映射中。这是我的代码。

public static void main(String[] args) {


        try {
            HashMap<String, Integer> map = sortingFromAFile("file.txt");
            printMap(map);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static HashMap sortingFromAFile(String fileName) throws FileNotFoundException {

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

        Integer count = 1;

        File file = new File(fileName);

        Scanner sc = null;
        try {
            sc = new Scanner(file);
            while(sc.hasNextLine()){
                String line = sc.nextLine();
                if (map.containsKey(line)){
                    map.put(line, count++);
                }
                map.put(line, count);

            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }


        return map;
    }

    public static void printMap(HashMap map){
        Iterator it = map.entrySet().iterator();
        while(it.hasNext()){
            Map.Entry pairs = (Map.Entry)it.next();
            System.out.println(pairs.getKey() + ":" + pairs.getValue()  );
        }
    }

程序运行时打印出文件中的文本。我在这里做错了什么。

3 个答案:

答案 0 :(得分:0)

您需要拆分线然后使用地图,否则您只是阅读并添加线条,如果线条不相同,则每条线条会出现1次。

 String [] words= line.split("[\\W]");

答案 1 :(得分:0)

您有一个计数错误以及Scanner类的错误使用,更改:

while(sc.hasNextLine()){
    String line = sc.nextLine();
    if (map.containsKey(line)){
        map.put(line, count++);
    }
    map.put(line, count);

}

为:

while(sc.hasNext()){
    String word = sc.next();
    if (map.containsKey(word)){
        map.put(word, map.get(word)+1);
    }
    else {
        map.put(word, 1);
    }
}

答案 2 :(得分:0)

我已经编写了这段代码,适用于您输入的任何类型的String,它返回带有长度的重复单词,也许这对您有任何帮助,您可以根据您的内容轻松更改它以便从文件中读取需要,您可以使用hashmap存储每行中重复单词的出现,然后将其与最后一行的匹配单词进行比较,依此类推。

import java.util.Arrays;
import java.util.Scanner;

/ **  * @author ArslanAppstellation  *  * /

public class RedundancyDetector {

/**
 * @param args
 */
public static void main(String[] args) {
    String userinput = "";
    while (true) {
        Scanner scanner = new Scanner(System.in);
        userinput = scanner.nextLine().replaceAll("\\s", "");
        if (userinput.contains("letsquit")) {
            break;
        }

        System.out.println(redudantString(userinput));
    }

}

public static String redudantString(String longStringOfCharacters) {

    // form the N Parts
    int N = longStringOfCharacters.length();
    String[] stringParts = new String[N];
    for (int i = 0; i < N; i++) {
        stringParts[i] = longStringOfCharacters.substring(i, N);
    }
    // sort them
    Arrays.sort(stringParts);

     String longest = "";
    for (int i = 0; i < N - 1; i++) {
        String iteratedLongest = matchWords(stringParts[i],
                stringParts[i + 1]);
        if (iteratedLongest.length() > longest.length())
            longest = iteratedLongest;
    }
    System.out.println(longest.length());
    return longest;
}

public static String matchWords(String ithElement, String ithplus1Element) {
    int length = Math.min(ithElement.length(), ithplus1Element.length());
    for (int i = 0; i < length; i++) {
        if (ithElement.charAt(i) != ithplus1Element.charAt(i))
            return ithElement.substring(0, i);
    }
    return ithElement.substring(0, length);
} }