正确使用“Hashtable”的方法?

时间:2014-02-10 22:21:11

标签: java hashtable

我是Hashtables的新手,我正在努力了解他们如何充分发挥作用。我需要确定一个字符串是否出现在一个包含大约100,000个字符串的大文件中,每个字符串都在各自的行上。我被告知HashTable比LinkedList或ArrayList更有效,运行时两者都是O(n)。

我已经查看了Java中的HashTable类,但由于需要键的“put”方法以及对象,我不知道我将如何输入文件中的每个字符串。

我想我可以使用扫描程序来浏览文件中的每个字符串,但是如何将它们输入到Hashtable中,以及如何在HashTable中使用contains()方法?

4 个答案:

答案 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在评论中提到的,HashMapHashSet只是MapSet的具体实现;这些实现使用哈希表,但这些类的其他实现是可用的。在构建表格时,您需要使用HashMapHashSet,但通常应将变量简单地声明为MapSet,因为这样您可以替换HashMapHashSet与其他一些实现相同方法的类。这样你就不会受到特定实现的束缚。

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

}