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

时间:2015-03-21 01:31:49

标签: java string set

我见过很多关于HasSets的大量资源,但没有什么可以帮助我解决这个特殊问题。我正在对泛型进行算法类,这个赋值需要使用Scanner(已完成)并使用hashSet将txt文件读入系统,加载txt文件以便我可以使用用户输入读取它并找到单词的出现次数。我有返回单词的方法,我已经完成了大部分的hashSet和文件阅读器代码。但我完全坚持如何将整个txt文件存储为一个hashSet。我无法通过犯罪来实现它。我和其他几个尝试过。我错过了一种更简单的方法来实现这种方法吗?感谢

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

编辑:好的,我已经编写了所有这些并且它运行但是它没有找到明确在txt文件中的单词,所以我错误地将文件添加到hashSet中。有任何想法吗?我试过使用数组列表,不同的String实现,我只是不知道在哪里转。感谢您提供任何有用的信息。

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 个答案:

答案 0 :(得分:4)

您发布了相互矛盾的要求。

  

查找出现次数

不同
  

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

HashSet适用于第二个。不是第一个。

阅读要求时要非常小心。阅读它们5分钟可以节省5个小时编写代码。

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

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

enter image description here

答案 1 :(得分:2)

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

您应该检查代码中的一些问题:

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

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

  • 您使用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 :(得分:0)

你不能用HashSet.做到这一点你将丢失重复项。您可以在添加重复项时对其进行计数,但是您需要在某处放置计数。

需要Map<String, Integer>