2011-03-06 75 views
0

我正在创建这个类,它是一个基于哈希映射的自定义Map。我有一个add方法,如果添加一个对象,则该对象将成为关键字,如果该对象当前不在列表中,则其值将为1。但是,如果添加当前在列表中的对象,它的值将会增加1.因此,如果我添加了10个完全相同的字符串,那么键将是该字符串,并且值将是10.我在实践中理解我遍历地图,实际上只有一个对象要迭代,但是,我正在尝试创建一个内部类,它将定义一个迭代器,该迭代器会迭代同一个对象,但其值多次。我可以通过简单地使用for循环来构造一个适当的ArrayList,并为此创建一个迭代器,但效率太低。有没有一个简单或更有效的方法来做到这一点?构建一个自定义迭代器

回答

1

你可以用两个变量做到这一点:

private T nextObj = null; 
private int times = 0; 

T next(){ 
    if(times==0){ 
     // get the next object and set the times variable to it's value in the hashmap 
    } 
    times--; 
    return nextObj; 
} 
+0

我看不到你用nextObj做了什么。你能解释一下这个变量吗? – Isai 2011-03-06 23:17:15

+0

它只是对迭代器要返回的下一个对象的引用。所以不要说“返回某些东西”,而是说“nextObj = something”。如果你还没有构建你自己的迭代器,你可以定义一个迭代器,然后使用Map的Iterator的next()来填充nextObj。 – dtech 2011-03-06 23:21:22

0

你可以使用nCopies从集合API。这将创建一个只有一个参考的列表,因此它会很有效率。然后,只需返回List的迭代器即可。无需创建一个内部类。

假设你Map<String, Integer>实例变量被称为地图,你可以做到以下几点:

Iterator<String> customIteratorForKey(String key) { 
    return Collections.nCopies(map.get(key), key).iterator(); 
} 
+0

我实际上必须使用扩展Iterator的内部类,因为这是一个学校项目:/ – Isai 2011-03-06 23:20:56

0

这听起来像你正在实施一个multiset or bag:一组计算每一个独特的元素。由于这是一个学校项目,我将介绍如何去做而不是提供代码。试试你的运气,如果你遇到问题,可以改进你的问题。

当我创建一个使用另一个集合的新集合类型时,我通常在构建迭代器时做同样的事情。

  1. Bag.Iterator的构造将与来自Map迭代器初始化。
  2. 正如dtech上面所示,迭代器需要跟踪它正在计数的当前对象以及它应该返回它的次数。
  3. next()需要在开始时获取下一个对象,并且一旦当前对象用完了计数。
  4. hasNext()必须做同样的事情,而不实际减少计数或抓住下一个对象。
0

我终于明白了。这是我的解决方案。感谢所有回应并给我指点的人。

private int times = 0; 
    private boolean flag = true; 

    Iterator<Entry<T, Integer>> it = Bag.entrySet().iterator(); 
    private Entry<T, Integer> t = it.next(); 
    private int value = t.getValue(); 
    private T nextObj = t.getKey(); 

    public boolean hasNext() { 
     if (times > 0) { 
      return true; 
     } 
     return it.hasNext(); 
    } 


    public T next() { 
     if (this.hasNext() == false) { 
      throw new NoSuchElementException(); 
     } 
     if (times == 0 && flag == true) { 
      times = value; 
      flag = false; 
     } 
     if (times == 0 && flag == false) { 
      t = it.next(); 
      value = t.getValue(); 
      nextObj = t.getKey(); 
      times = value; 
     } 
     times--; 
     return nextObj; 
    }