我是Hashtables的新手,我正在努力了解他们如何充分发挥作用。我需要确定一个字符串是否出现在一个包含大约100,000个字符串的大文件中,每个字符串都在各自的行上。我被告知HashTable比LinkedList或ArrayList更有效,运行时两者都是O(n)。
我已经查看了Java中的HashTable类,但由于需要键的“put”方法以及对象,我不知道我将如何输入文件中的每个字符串。
我想我可以使用扫描程序来浏览文件中的每个字符串,但是如何将它们输入到Hashtable中,以及如何在HashTable中使用contains()方法?
答案 0 :(得分:3)
对我来说,这听起来像是HashSet
的用例。检查一下!
您只放入值,这些值以不同的方式存储(没有加倍的值)。然后,您可以调用contains
方法,检查您的String是否在Set中。
答案 1 :(得分:1)
您可以将字符串放入HashSet
。
Set yourStrings = new HashSet<String>();
for (String line : yourFile) {
yourStrings.add(line);
}
然后检查是否存在特定字符串:
if (yourStrings.contains("Hi!")) {
// It's present
}
else {
// It's not present
}
答案 2 :(得分:1)
Hashtable
已经过时了,已被HashMap
取代。还有HashSet
。两者都使用哈希表,但它们有不同的用途。如果要将某种值与每个键相关联,则使用HashMap
;例如,您可以使用它来查找某人的姓名并获取他们的电话号码。但是,HashSet
只存储没有任何值的键。您只是为了向集合添加名称,然后检查名称是否在集合中。
正如Luiggi在评论中提到的,HashMap
和HashSet
只是Map
和Set
的具体实现;这些实现使用哈希表,但这些类的其他实现是可用的。在构建表格时,您需要使用HashMap
和HashSet
,但通常应将变量简单地声明为Map
和Set
,因为这样您可以替换HashMap
或HashSet
与其他一些实现相同方法的类。这样你就不会受到特定实现的束缚。
答案 3 :(得分:1)
您需要一个HashSet来存储文件的每一行。
*只有当您对文件中每个字符串的出现次数感兴趣时,才可能需要HashMap。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class MyFileUtils {
//this can be omitted, just added to increase speed
//when requiring multiple searches in the same file, to avoid recalculations.
//Use it only if you need to search in one file ONLY
private static Set<String> stringLines = null;
/*
* Get a HashSet of all the (distinct) lines in a file
*/
public static Set<String> getStringLinesFromFile (String filePath) {
//this can be omitted, just added to support fast multiple calls of this function
if (stringLines != null) return stringLines;
Set<String> stringLines = new HashSet<String>();
Scanner scanner = null;
try {
scanner = new Scanner(new File(filePath));
while (scanner.hasNextLine())
stringLines.add(scanner.nextLine());
} catch (FileNotFoundException e) {
System.out.println("File does not exist");
} finally {
if(scanner != null)
scanner.close();
}
//as the first line, this can be omitted, just added to support fast multiple calls of this function
MyFileUtils.stringLines = stringLines;
return stringLines;
}
/*
* Call this method to search for a stringLine in a file
*/
public static boolean checkIfStringExistsInFile(String filePath, String aStringLine) {
return getStringLinesFromFile(filePath).contains(aStringLine);
}
//Test
public static void main (String args[]) {
System.out.println(checkIfStringExistsInFile("test.txt", "Hello World"));
}
}