获取Hashset密钥

时间:2014-10-17 17:39:10

标签: java key hashset

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public static void printNumWordsDiscovered( HashMap<String,Integer> vocab, HashSet<String> dictionary ) {
        HashMap <String,Integer> Combine = new HashMap <String,Integer> ();
        Iterator iterVoc = vocab.entrySet().iterator();
        List<String> Dic = new ArrayList<String>();
        int i = 0;
        double actual =  0.0;
        double token = 0.0;
        while(iterVoc.hasNext()){
            Map.Entry iterVocE = (Map.Entry)iterVoc.next();
            if (dictionary.contains(iterVocE.getKey().toString())){

                int Value =  (int) iterVocE.getValue();
                actual += 1;
                token  += Value;
                Combine.put(iterVocE.getKey().toString(), Value);

            }
        }
        for(String s: dictionary.KeySet()){
            if (Combine.contains(dictionary.get(s).toString())){
                System.out.println("Dicovered " + dictionary.get(s) + " ( count " + Combine.get(dictionary.get(s)) + " )");
            }
        }
}

我正在尝试遍历HashSet,并且我得到有关我的.get()方法的错误。你如何在HashSet中获得密钥?

2 个答案:

答案 0 :(得分:2)

HashSet由HashMap支持。我想先提一下,因为马努蒂所说的并不完全正确。 HashSet确实有一个键;你只是没有明确地知道来自HashSet外部的密钥(或者你没有把它称为密钥,你称之为HashSet之外的值)。

实际上,内部HashMap中的键是您在HashSet #add(E)中使用的值。 HashSet的代码#add(E):

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

其中PRESENT只是值的虚拟对象:

private static final Object PRESENT = new Object();

您想要做的是调用HashSet的迭代器来迭代所有键。根据java.util.HashSet#iterator文档:

  

返回此set中元素的迭代器。元素按特定顺序返回。

所以这相当于获取内部HashMap,获取HashMap#keySet,然后获取迭代器。并不重要,但这正是HashSet的内部代码实际上是如何做到的:

public Iterator<E> iterator() {
    return map.keySet().iterator();
}

所以这可能比你想要的更多一些解释,但对你的问题: 没有HashSet #get函数,没有HashSet#KeySet函数,没有HashMap#contains函数所以我建议你在访问http://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html和HashMap文档http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html中的HashSet文档>任何进一步。如有疑问,请阅读文档。在Java中,您可以获得处理API的独特优势,该API非常有据可查。如果你选择不使用它,那就浪费了。

为了获得&#34;在HashSet中你必须拥有导致相同hashCode的对象...所以我不确定我是否完全理解你正在做的事情的逻辑。换句话说,如果你已经有了这个对象,你就不需要从HashSet中获取它。

无论如何,您的代码的最后6行可以更改为:

    for(String s: dictionary.iterator()){
        if (Combine.containsKey(s)){
            System.out.println("Dicovered " + s + " ( count " + Combine.get(s) + " )");
        }
    }

答案 1 :(得分:0)

您可以使用HashSet的Iterator。

Iterator it = dictionary.iterator();
String element;
while ( it.hasNext() ) {
    element = ( String ) it.next();
    if ( Combine.contains(element) ){
        System.out.println("Dicovered " + element + " ( count " + Combine.get(element) + " )");
}
}

使用返回Iterator的迭代器方法迭代HashSet。 使用迭代器模式而不是:

 for(String s: dictionary.KeySet()){
            if (Combine.contains(dictionary.get(s).toString())){
                System.out.println("Dicovered " + dictionary.get(s) + " ( count " + Combine.get(dictionary.get(s)) + " )");
            }
        }
祝你好运!