有 Java 编程相关的问题?

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

java使用HashSet存储文本文件并从中读取

我已经看到了很多关于hasset的优秀资源,但是没有任何东西可以帮助我解决这个问题。我正在学习一门关于泛型的算法课程,这个任务要求使用Scanner(已经完成)将一个txt文件读入系统,并使用hashSet加载txt文件,这样我就可以通过用户输入读取它,并找到单词的出现次数。我有返回单词的方法,我已经完成了大部分哈希集和文件读取器代码。但我完全被困在如何将整个txt文件存储为一个哈希集上。我不能通过犯罪来让它发挥作用。我尝试了一些其他的方法。我是否缺少一种更容易实现此方法的方法?谢谢

编辑:作业说明- 课程1(70分) 加载一个java。util。哈希特用小说《罪和罚》中的词语写成 西奥多·陀思妥耶夫斯基(本作业黑板上提供的文本文件)。提示用户 输入一个单词并报告该单词是否出现在小说中

编辑:好的,我已经写了所有这些,并且它运行了,但是它没有找到txt文件中肯定存在的单词,所以在某个地方我把文件添加到哈希集中时出错了。有什么想法吗?我尝试过数组列表、不同的字符串实现,但我不知道该从哪里入手。谢谢你提供的有用信息

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

共 (3) 个答案

  1. # 1 楼答案

    看起来你不需要计算单词的出现次数。您只需输入文件字符串拆分为单个单词,并将它们存储到HashSet<String>中。然后,您应该使用方法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");
    }
    
  2. # 2 楼答案

    您发布的要求相互冲突

    find the number of occurrences

    不一样

    report whether or not that word appears in the novel.

    HashSet对于第二个很好。不是第一次

    阅读要求时要非常小心。5分钟的额外阅读可以为您节省5小时的额外代码编写时间

    要按照说明操作,您需要做的是一次向哈希集中添加一个单词。一次读一个单词已经有了答案here

    每当我不确定使用哪种容器时,我会看到:

    enter image description here

  3. # 3 楼答案

    使用HashSet.无法做到这一点,您只会丢失重复项。当你添加它们时,你不能计数重复项,但是你需要一个地方来放置计数

    需要一个Map<String, Integer>