java如何为映射实现创建自定义迭代器?
我实现了一个独特的地图。这是一个双向的哈希映射,其中不仅键是唯一的,而且值也是唯一的
public interface UniqueMap<K,V>{
V uniquePut(K key, V value);
UniqueMap<V,K> inverse();
}
这是一种可能的实现方式:
public class SimpleUniqueMap<K,V> implements UniqueMap<K,V>, Iterable<K>{
public HashMap<K,V> uniqueMap = new HashMap<K,V>();
class EnumSimpleUniqueMap implements Iterator<K>{
int count = uniqueMap.size();
public boolean hasNext(){
return count > 0;
}
public K next(){
if(count == 0){
throw new NoSuchElementException();
}else{
count--;
//...
}
}
public void remove(){
throw new UnsupportedOperationException();
}
}
public Iterator<V> iterator(){
return new EnumSimpleUniqueMap();
}
public V uniquePut(K key, V value){
return null;
}
public UniqueMap<V,K> inverse(){
return null;
}
}
正如你所见,我已经尝试为我的唯一映射实现一个迭代器。但是从hashmap中,值不是通过位置而是通过键来访问的。所以通常我会取计数器和访问值,但在这种情况下,这是不可能的
实际上,迭代这些键并逐个检索它们就足够了。我该怎么做?有没有办法检索某种同时包含键和值的条目对象
我知道我可以从映射对象中检索迭代器,但这不是我的选项
# 1 楼答案
更新:最简单的方法是使用
但是如果你真的想自己翻滚,那么考虑一下:通常,
Maps
不实现Iterable
。在您的情况下,您可以通过调用其中任何一个来免费获得Iterator
在你的地图上,取决于你想要迭代的内容。为此,你必须
扩展实现也是一个好主意
它已经有了很多地图的基本功能
# 2 楼答案
您可以通过简单地委托给支持hashmap的键集迭代器来实现
iterator()
方法:当然,正如卢卡斯所说,通常地图是不可编辑的,但它提供的集合视图本身是可编辑的
另外,对于您独特的映射实现来说,在两个方向上都有哈希映射可能是一个好主意
此外,请思考(并在界面中指定):如果用户插入一个具有现有值的新密钥,会发生什么情况?这会失败、被忽略、删除现有映射,还是什么
# 3 楼答案
你应该看看Guava library(谷歌收藏)。他们有一个BiMap实现,这似乎正是您试图实现的