0

如何使用数组计算文本文件中重复的单词?

我的程序能够打印出文件中的总单词,但是我怎样才能让我的程序打印不同单词的数量,并且还打印出重复单词的数量列表,如下所示:

蛋糕:4 个:320 块:24 块中的 2 块

   (带有大写字母和小写字母的单词被认为是同一个单词)

void FileReader() { 


    System.out.println("Oppgave A");
    int totalWords = 0; 
    int uniqueWords = 0; 
    String [] word = new String[35000];
    String [] wordC = new String [3500];
    try {
        File fr = new File("Alice.txt");
        Scanner sc = new Scanner (fr);

        while(sc.hasNext()){
        String words = sc.next();
        String[] space = words.split(" ");
        String[] comma = words.split(",");
            totalWords++;


            }
        System.out.println("Antall ord som er lest er: " + totalWords);         
    } catch (Exception e) {

        System.out.println("File not found");

    }
4

6 回答 6

2

这对于数组来说是非常低效的,因为在每个单词之后,您必须遍历数组以查看该单词是否已经出现。而是使用 HashMap,其中键是单词,值是出现次数。查看 HashMap 是否包含键比查看数组是否包含元素更容易和更快。

编辑:

HashMap<String, Integer>
于 2013-11-12T10:52:10.340 回答
1

尝试使用集合,并使用迭代检查返回值。

Set<String> set = new HashSet(Arrays.asList(word));
int unique = 0;
for (String temp : word) {
    if (set.add(temp)) {
        unique++;
    }
}

//or...
Set<String> set = new HashSet(Arrays.asList(word));
int unique = set.size();

这当然是在已经导入所有值之后。

编辑:看到你不能使用地图(并假设其他数据结构),你可能不得不做一些粗略的检查每个值的方法。

//get a new word from the text file
boolean isUnique = true;
//for every word in your array; input == your new word
    if (word.equalsIgnoreCase(input)) {
        unique = false
    }
//end loop
if (isUnique) {
    unique++; // Assuming unique is the count of unique words
}
于 2013-11-12T10:52:47.880 回答
1

每次添加一个已经在地图中的单词时,您都可以使用地图来增加值(计数)

于 2013-11-12T10:53:09.513 回答
0

尝试这个:

 try {
            List<String> list = new ArrayList<String>();
            int totalWords = 0;
            int uniqueWords = 0;
            File fr = new File("Alice.txt");
            Scanner sc = new Scanner(fr);
            while (sc.hasNext()) {
                String words = sc.next();
                String[] space = words.split(" ");
                for (int i = 0; i < space.length; i++) {
                    list.add(space[i]);
                }
                totalWords++;
            }
            System.out.println("Words with their frequency..");
            Set<String> uniqueSet = new HashSet<String>(list);
            for (String word : uniqueSet) {
                System.out.println(word + ": " + Collections.frequency(list,word));
            }
        } catch (Exception e) {

            System.out.println("File not found");

        }
于 2013-11-12T11:04:04.247 回答
0

每次添加单词时,您都需要检查该单词是否已存在于您的数组中。要进行比较,您将需要使用:

 word1.equalsIgnoreCase(word2);
于 2013-11-12T10:54:23.957 回答
0

您可以使用Arrays.sortArrays.binarySearch改进简单的数组搜索。

本质上,对于每个单词,检查它是否已经在你的数组中binarySearch。如果是,请增加您的计数。如果不是,则将其添加到数组中并再次排序。当前的 Java 排序算法在数组已经大部分排序时非常快。它使用TimSort

您可以使用其他结构TreeSet来避免使用散列,但我怀疑这也是不允许的。

于 2013-11-12T11:27:10.803 回答