我见过很多关于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");
}
}
}
答案 0 :(得分:4)
您发布了相互矛盾的要求。
查找出现次数
与
不同报告该单词是否出现在小说中。
HashSet适用于第二个。不是第一个。
阅读要求时要非常小心。阅读它们5分钟可以节省5个小时编写代码。
要按照说明操作,您需要一次向哈希集添加一个单词。一次读一个单词已经有了答案here
每当我不确定使用什么容器时,我都会看到这个:
答案 1 :(得分:2)
看起来你不需要计算单词出现次数。您只需要将输入文件字符串拆分成单个单词,然后将它们存储到HashSet<String>
中。然后你应该使用方法contains()
来检查用户给出的单词是否存在于集合中。
您应该检查代码中的一些问题:
useDelimiter()
中使用Scanner
的方式不正确。您可能不想指定分隔符,以便使用默认的空格。
如果您使用空格作为扫描仪分隔符,它将已将输入拆分为单词。因此,我们不需要逐行阅读文件。
您使用crime.contains(input)
查找用户提供的字词。但input
是Scanner
,而不是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>
。