java - 如何为 Map 实现创建自定义迭代器?

标签 java hashmap

我实现了一个独特的 map 。这是一个双向的 HashMap ,其中不仅键是唯一的,值也是。

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;
    }
}

如您所见,我已经尝试为我的独特 map 实现一个迭代器。但是从 HashMap 中,值不是按位置访问的,而是按键访问的。所以通常我会获取计数器和访问值,但在这种情况下这是不可能的。

实际上,遍历键并逐个检索它们就足够了。我怎样才能做到这一点?有没有办法检索某种包含键和值的条目对象?

我知道我可以从 map 对象中检索迭代器,但这不是我的选择。

最佳答案

更新:最简单的方法是使用

org.apache.commons.collections.BidiMap

但是如果你真的想自己动手,那么考虑一下:

通常,Maps 不实现Iterable。在您的情况下,您可以通过调用其中任何一个免费获得 Iterator

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();

在您的 map 上,具体取决于您要迭代的内容。为此,你必须做

public interface UniqueMap<K,V> extends Map<K, V> {
    // no need for uniquePut(), you already have Map.put()
    UniqueMap<V,K> inverse(); 
}

扩展你的实现也是一个好主意

java.util.AbstractMap<K, V>

它已经有很多 map 的基本功能。

关于java - 如何为 Map 实现创建自定义迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6571320/

相关文章:

java - Android - Java - 单击按钮时保存字符串

java - .EAR部署命令wildfly-8.0.0Final

java - 将 postgresql 数据库添加到 travis

java - 如何从流计算 map ,然后检查 map 值的属性?

java - 使用 hashmap 读取 xls 文件

java - 在 jlabel 背景上添加 jpanel

java - 直接注入(inject) JpaRepository<User>

rust - 有没有办法为特定的 HashSet 或 HashMap 覆盖类型的相等性和哈希函数?

jakarta-ee - Struts 2-s :select using Map

java - 在java中从数组列表多映射创建嵌套Json