2011-04-05 24 views
1

我有一個地圖項的列表,我需要一個可返回地圖的鍵的迭代。你可以使這個關鍵可視化的地圖列表視圖更好嗎?

當然,我們可能是天真的,並複製到所需類型的新集合,但效率不高。

因此,讓我們看看我們是否可以使用泛型提供現有結構的視圖。是的,我能夠做到這一點,但並不完美:當它傳遞給期望可重用的函數<K>時,它會提供未經檢查的轉換。是否可以改進以避免這些警告?

也許它可以實現Iterable <K>類似於被註釋掉的線,這是我嘗試但不能完成的路徑。你能弄清楚類似但正確(沒有使用警告)泛型實現嗎?

這應該幫助演示ListKeyIterable如何使用:

名單的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()); } 
} 
+0

這可能是更好的適合於http://codereview.stackexchange.com。 – 2011-04-05 20:08:15

+0

很高興知道,謝謝。 – Ron 2011-04-05 21:26:50

+0

爲什麼你使用'?'作爲typename? – mbx 2011-04-06 09:04:46

回答

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

} 
+0

原來你甚至不需要T.你只需要K.這是唯一真正通用的東西。 – corsiKa 2011-04-05 20:06:50

+0

也將類作用於函數。 Java提供的封裝比您以前需要的還要多:-) – corsiKa 2011-04-05 20:11:42

+0

非常乾淨!看起來它可能有一個缺點,與你之前的相比:我看到了你的中間一個,但沒有嘗試它。如果你還有第一個版本,我想再看看。 – Ron 2011-04-05 21:18:01

1

原來我只是需要通過這兩種類型的參數化,這樣通用:

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