Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为映射实现创建自定义迭代器?_Java_Hashmap - Fatal编程技术网

Java 如何为映射实现创建自定义迭代器?

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

我实现了一个独特的地图。这是一个双向的hashmap,其中不仅键是唯一的,而且值也是唯一的

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集合)。他们有一个实现,似乎正是你想要实现的