【问题标题】:Using HashSet to store a text file and read from it使用 HashSet 存储文本文件并从中读取
【发布时间】:2015-03-21 01:31:48
【问题描述】:

我看到了很多关于 HasSets 的优秀资源,但没有任何东西可以帮助我解决这个特殊问题。我正在学习关于泛型的算法类,这个作业需要使用 Scanner(已完成)和使用 hashSet 将 txt 文件读入系统,加载 txt 文件以便我可以通过用户输入读取它并找到单词的出现次数。我有返回单词的方法,并且我已经完成了大部分 hashSet 和文件阅读器代码。但是我完全不知道如何将整个 txt 文件存储为一个 hashSet。我无法通过做 crime.add 来让它工作,我尝试了其他几件事。我是否错过了实现此方法的更简单方法?谢谢

编辑:分配说明 - 节目一(70分) 用小说“罪与罚”中的词加载 java.util.HashSet,由 西奥多·陀思妥耶夫斯基(Blackboard 上提供此作业的文本文件)。提示用户 输入一个词并报告该词是否出现在小说中。

编辑:好的,我已经编写了所有这些并且它运行但它没有找到肯定在 txt 文件中的单词,所以我在某个地方出错了将文件添加到 hashSet 中。有任何想法吗?我尝试过使用数组列表、不同的字符串实现,但我只是不知道该去哪里。感谢您提供任何有用的信息。

import java.awt.List;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class CandPHashSet {
    public static void main(String[] args) throws FileNotFoundException{
        Scanner file = new Scanner(new File("crime_and_punishment.txt")).useDelimiter("[ˆa-zA-Z]+");
        Scanner input = new Scanner(System.in);

        Set<String> crime = new HashSet<String>();

        while(file.hasNext()){
            String line = file.nextLine();
            //String[] words = line.split("[ˆa-zA-Z]+");
            for (String word : line.split("[ˆa-zA-Z]+")){
                crime.add(line);
            }
        }

        String search;
        System.out.println("Enter a word to search for: ");
        search = input.next();

        if(crime.contains(input)){
            System.out.println("Yes");
        }else{
            System.out.println("No");
        }
    }
}

【问题讨论】:

  • 我已经做到了这一点,但看起来我仍然没有正确添加它......

标签: java string set


【解决方案1】:

您发布的要求相互冲突。

找出出现的次数

不一样

报告该词是否出现在小说中。

HashSet 可以很好地用于第二个。不是第一次。

阅读需求时要非常小心。多花 5 分钟阅读它们可以为你节省 5 小时额外的代码编写时间。

要按照说明进行操作,您需要一次将一个单词添加到您的哈希集中。一次读一个字已经有了答案here

每当我不确定要使用什么容器时,我都会看看这个:

【讨论】:

    【解决方案2】:

    看起来您不需要计算单词的出现次数。您只需将输入文件字符串拆分为单个单词,并将它们存储到HashSet&lt;String&gt; 中。然后你应该使用方法contains()来检查用户给出的单词是否存在于集合中。

    您的代码中有几个问题需要检查:

    • 您在Scanner 中使用useDelimiter() 的方式不正确。您可能不想指定分隔符,以便使用默认的 空格

    • 如果您使用 空格 作为扫描仪分隔符,它已经将您的输入拆分为单词。所以我们不需要逐行读取文件。

    • 您使用crime.contains(input) 来查找用户提供的单词。但是inputScanner,而不是String。你想使用crime.contains(search)

    修改后的代码看起来有点像这样:

    // Read the file using whitespace as a delimiter (default)
    // so that the input will be split into words
    Scanner file = new Scanner(new File("crime_and_punishment.txt"));
    
    Set<String> crime = new HashSet<>();
    // For each word in the input
    while (file.hasNext()) {
        // Convert the word to lower case, trim it and insert into the set
        // In this step, you will probably want to remove punctuation marks
        crime.add(file.next().trim().toLowerCase());
    }
    
    System.out.println("Enter a word to search for: ");
    Scanner input = new Scanner(System.in);
    // Also convert the input to lowercase
    String search = input.next().toLowerCase();
    
    // Check if the set contains the search string
    if (crime.contains(search)) {
        System.out.println("Yes");
    } else {
        System.out.println("No");
    }
    

    【讨论】:

    • 感谢你们,这是我的错,因为我将这两个程序结合在一起。计数出现在地图分配中。但我遇到的问题是将文本文件加载到 hashSet 如您所见,我创建了 hashSet 并读取了文件,但我似乎找不到将文件实际添加为字符串的有效方法
    • 啊,那是因为。我会搞砸一段时间,非常感谢!
    • 嘿,抱歉,我又搞定了一些,但我仍然在拆分这个东西时遇到问题。我正在编辑代码以反映这些更改,但为什么我不能逐行执行此操作并将其加载到集合中?我迷路了
    • 现在它可以工作了,但是我检查了文件,它肯定多次包含“The”这个词,但程序说“no”。我现在应该以不同的方式拆分单词吗,或者这似乎是添加文件的问题?
    • 我现在让它变得简单了一些。一个好的提示是在循环之后放置一个 System.out.println(crime) 以检查设置的内容。然后你可以看看你要找的词是否真的在里面。
    【解决方案3】:

    HashSet. 无法做到这一点,您只会丢失重复项。您可以在添加重复项时对它们进行计数,但是您需要在某个地方放置计数。

    Map&lt;String, Integer&gt; 是必需的。

    【讨论】:

    • 我已经用地图完成了,但是这个新的分配必须用 HashSet 完成
    • 如前所述,这是不可能的。我建议您发布作业的实际措辞,而不是对其进行模糊的重述。将其编辑到您的问题中。
    • 天哪,对不起 EJP,我正在梳理作业。计数是为了映射项目,你是对的。抱歉!
    猜你喜欢
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多