你能否更好地使这个Key-interable视图更好地映射?

时间:2011-04-05 19:50:00

标签: java list generics map iterator

我有一个地图条目列表,我需要一个返回地图键的迭代。

当然,我们可能天真并将其复制到所需类型的新集合中,但效率低下。

那么让我们看看我们是否可以使用泛型提供现有结构的视图。是的,我能够做到这一点,但它并不完美:当它传递给期望Iterable< K>的函数时,它会提供未经检查的转换。是否可以改进以避免这些警告?

也许它可以实现Iterable< K>类似于注释掉的行,这是我尝试但无法完成的路径。你能弄清楚类似但正确(没有使用警告)的通用实现吗?

这应该有助于演示如何使用ListKeyIterable:

列表与LT; Map.Entry<长,字符串> >列表;

void traverse( Iterable<Long> ) {}

traverse( new ListKeyIterable<List<Map.Entry<Long,String>>>( list );

这是工作代码,但是在调用traverse()时会给出未经检查的转换警告。

class ListKeyIterable<T extends List<? extends Map.Entry<?,?>>> implements Iterable
//class ListKeyIterable<T extends List<? extends Map.Entry<K,?>>> implements Iterable<K>
{
    T list;

    public ListKeyIterable( T list ) { this.list = list; }

    class ListKeyIterator<K> implements Iterator<K> {
        Iterator<Map.Entry<K,?>> iterator;

        public ListKeyIterator( Iterator<Map.Entry<K,?>> iterator ) { this.iterator = iterator; }
        @Override public boolean hasNext() { return iterator.hasNext(); }
        @Override public K next() { return iterator.next().getKey(); }
        @Override public void remove() { throw new RuntimeException( "ValueListIterator remove() not implemented." ); }
    }

    @Override public Iterator iterator() { return new ListKeyIterator( list.iterator() ); }
    //@Override public <K> Iterator<K> iterator() { return new ListKeyIterator( list.iterator() ); }
}

2 个答案:

答案 0 :(得分:2)

import java.util.*;
class ListKeyIterable<K,V> implements Iterable<K> {

    List<Map.Entry<K,V>> list;

    public ListKeyIterable(List<Map.Entry<K,V>> list) {
        this.list = list;
    }

    @Override public Iterator<K> iterator() {
        class ListKeyIterator<K> implements Iterator<K> {
                Iterator<Map.Entry<K,V>> iterator;

                public ListKeyIterator( Iterator<Map.Entry<K,V>> iterator ) {
                    this.iterator = iterator;
                }
                @Override public boolean hasNext() {
                    return iterator.hasNext();
                }
                @Override public K next() {
                    return iterator.next().getKey();
                }
                @Override public void remove() {
                    throw new UnsupportedOperationException( "ValueListIterator remove() not implemented." );
                }
        }
        return new ListKeyIterator<K>( list.iterator() );
    }

}

答案 1 :(得分:1)

事实证明我只需要通用两种类型的参数化,如下所示:

class ListKeyIterable<K,T extends List<? extends Map.Entry<K,?>>> implements Iterable<K>