2014-10-17 83 views
1
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中的密钥?获取Hashset键

+0

哪一行导致错误。 – brso05 2014-10-17 17:42:01

回答

0

您可以使用HashSet的迭代器。

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

使用迭代器方法迭代HashSet,该方法返回Iterator。 使用迭代器模式代替:

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

祝你好运!

1

HashSet由HashMap支持。我想首先提到这一点,因为manouti所说的不完全正确。 HashSet确实有一个键;你只是不明确地知道HashSet之外的密钥(或者你不把它称为密钥,你把它称为HashSet之外的值)。

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

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

如果存在的话就是该值的虚拟对象:

private static final Object PRESENT = new Object(); 

你想要做什么,是叫迭代器的HashSet遍历所有的钥匙。根据java.util.HashSet#iterator文档:

返回此集合中元素的迭代器。元素以特定顺序返回。

所以这相当于获取内部HashMap,获取HashMap#keySet,然后获取迭代器。这不是问题,但是这是一个HashSet的内部代码究竟是如何真正做的:

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

所以这可能比你要找的,但你的问题多一点解释: 没有的HashSet #get函数,没有HashSet#KeySet函数,没有HashMap#包含函数,所以我建议您在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的记录非常详尽。如果你选择不使用它,那就浪费了。

为了从HashSet中“获取”任何东西,你必须有产生相同hashCode的对象......所以我不确定我是否理解你正在做什么的逻辑。换句话说,如果你已经有了这个对象,你不需要从HashSet中获取它。

总之,在过去的6行代码可以改变这样:

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