Java 如何为映射实现创建自定义迭代器?
我实现了一个独特的地图。这是一个双向的hashmap,其中不仅键是唯一的,而且值也是唯一的Java 如何为映射实现创建自定义迭代器?,java,hashmap,Java,Hashmap,我实现了一个独特的地图。这是一个双向的hashmap,其中不仅键是唯一的,而且值也是唯一的 public interface UniqueMap<K,V>{ V uniquePut(K key, V value); UniqueMap<V,K> inverse(); } 公共接口唯一映射{ V唯一输出(K键,V值); 唯一映射逆(); } 这是一种可能的实现方式: public class SimpleUniqueMap<K,V> i
public interface UniqueMap<K,V>{
V uniquePut(K key, V value);
UniqueMap<V,K> inverse();
}
公共接口唯一映射{
V唯一输出(K键,V值);
唯一映射逆();
}
这是一种可能的实现方式:
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;
}
}
公共类SimpleUniqueMap实现了UniqueMap,Iterable{
public HashMap uniqueMap=new HashMap();
类EnumSimpleUniqueMap实现迭代器{
int count=uniqueMap.size();
公共布尔hasNext(){
返回计数>0;
}
公共K next(){
如果(计数=0){
抛出新的NoTouchElementException();
}否则{
计数--;
//...
}
}
公共空间删除(){
抛出新的UnsupportedOperationException();
}
}
公共迭代器迭代器(){
返回新的EnumSimpleUniqueMap();
}
公共V唯一输出(K键,V值){
返回null;
}
公共唯一映射逆(){
返回null;
}
}
如您所见,我已经尝试为我的唯一映射实现迭代器。但是从hashmap中,值不是通过位置而是通过键来访问的。所以通常我会接受计数器和访问值,但在这种情况下,这是不可能的
实际上,对键进行迭代并逐个检索就足够了。我该怎么做?有没有一种方法可以检索某种同时包含键和值的条目对象
我知道我可以从映射对象检索迭代器,但这不是我的选项 更新:最简单的方法是使用
org.apache.commons.collections.BidiMap
但是如果你真的想自己翻滚,那么考虑一下:
通常,Maps
不实现Iterable
。在您的情况下,您可以通过调用其中任何一个来免费获得迭代器
map.keys().iterator(); // is the same as
map.inverse().values().iterator();
map.values().iterator(); // is the same as
map.inverse().keys().iterator();
map.entrySet().iterator(); // almost the same as
map.inverse().entrySet().iterator();
在地图上,取决于要迭代的内容。为此,你必须
public interface UniqueMap<K,V> extends Map<K, V> {
// no need for uniquePut(), you already have Map.put()
UniqueMap<V,K> inverse();
}
公共接口UniqueMap扩展映射{
//不需要uniquePut(),您已经有Map.put()
唯一映射逆();
}
扩展实现也是一个好主意
java.util.AbstractMap<K, V>
java.util.AbstractMap
它已经为映射提供了很多基本功能。您可以通过简单地委托给支持hashmap的键集迭代器来实现
迭代器()
方法:
public Iterator<K> iterator(){
return uniqueMap.keySet().iterator();
}
公共迭代器迭代器(){
返回uniqueMap.keySet().iterator();
}
当然,正如卢卡斯所说,通常地图是不可编辑的,但提供的集合视图本身是可编辑的
另外,对于您独特的映射实现来说,在两个方向上都有hashmap可能是一个好主意
此外,请思考(并在界面中指定):如果用户插入一个具有现有值的新密钥,会发生什么情况?这是否会失败、被忽略、删除现有映射,或者发生什么情况?您应该查看一下(Google集合)。他们有一个实现,似乎正是你想要实现的