【问题标题】:count amount of unique words in a text file? (Not allowed to use Hash)计算文本文件中唯一单词的数量? (不允许使用哈希)
【发布时间】:2013-11-12 10:48:25
【问题描述】:

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

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

蛋糕:4 一个:320 件数:2 24

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

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");

    }

【问题讨论】:

标签: java arrays string text count


【解决方案1】:

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

编辑:

HashMap<String, Integer>

【讨论】:

  • 我们还不能使用 HashMaps :/
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    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();
    

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

    编辑:看到您不能使用 Maps(并假设其他数据结构),您可能不得不采取某种粗略的方式来检查每个值。

    //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
    }
    

    【讨论】:

    • 但是如何将 txt 文件中的单词添加到数组中,然后检查两个或多个单词是否相同?
    • 澄清一下?您需要单词出现的次数、唯一单词的数量,还是……?您可以通过将您从文本文件中获得的单词与数组中的每个当前单词进行比较来进行此验证。
    • - 计算每个单词出现的次数。注意:您可以假设最大 5000 是正在读取的文件的唯一(不同,奇数)单词 - 然后为读出的文本中的每个唯一单词出现一行,其中包含单词及其出现的次数。打印的单词顺序是任意的。蛋糕:4 块:320 块:2 块,共 24 块 这是作业^^
    • 如果你不能使用地图,我会诚实地为这个词创建一个包装类。 AKA 你有另一个类,你将存储单词和它出现的次数,然后当你遍历所有这些类时,将引入的单词与其他单词进行比较。
    【解决方案4】:

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

     word1.equalsIgnoreCase(word2);
    

    【讨论】:

    • 您需要对数组中的每个单词都这样做。
    • @Rogue OP 确实指定忽略大小写。
    • @Radiodef 是的,我是说每次添加单词时都必须手动遍历整个数组,而不是大小写。虽然看到最近关于地图的评论,但我认为这是家庭作业,并且也调整了我自己的答案。
    【解决方案5】:

    试试这个:

     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");
    
            }
    

    【讨论】:

    • 问题是我们不允许使用哈希,我们必须使用简单的数组来解决问题...否则非常感谢
    【解决方案6】:

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

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

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

    【讨论】:

    • 它说我们必须使用二维数组
    • @ThinkPink93 - 你确定吗?我想不出为什么您需要在这里使用二维数组。
    • 抱歉,不是二维数组,而是数组
    • @ThinkPink93 - 使用数组,您可以使用Arrays.sort 对它们进行排序并使用Arrays.binarySearch 搜索它们。这将使您不必一次遍历一个条目来查找您的单词。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2011-01-27
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多