簡體   English   中英

如何創建由 Map 支持的可變列表

[英]How do I create a mutable List backed by Map

如果我有將Map值映射到鍵valueToKeyMapper的方法,如何返回由Map<K, E> List<E>支持的List<E>

class Foo {
   private Map<Integer, String> backedMap = new HashMap<Integer, String>();

   public List<String> getList() {
      // NEED TO RETURN LIST BACKED BY MAP
   }

   public String getById(Integer id) {
      return backedMap.get(id);
   }

   private static Integer valueToKeyMapper(String value) {
      // just as exampl. In reality value will be POJO with method like getId()
      return value.hashCode();
   }
}

代碼應該像這樣工作(簡單示例):

Foo foo = new Foo();
foo.getList().add("something");
String value = foo.getById("something".hashCode());
// I should see something

筆記:

  • List應該是可變的,並且更改必須在底層Map傳播
  • 我不能修改對象Foo公共方法,因為它在其他項目中使用
  • 我不在乎List順序
  • getById方法應該繼續快速工作

嘗試這樣的事情:---


List<String> list = new ArrayList<>();  

Set keys = backedMap.keySet();
for (Iterator i = keys.iterator(); i.hasNext(); ) {
           Integer key = (Integer) i.next();
           String value = (String) backedMap.get(key);
           list.add(value);
       }


 //To print Values in ArrayList :--    
    for(String s : list) {
              System.out.println("printing element -- " + s);
          }

嘗試在 github 上使用此ListListBackedByMap.java

它使用ForwardingList來維護地圖中列表的內部副本。

我發現這個 impl 有兩個問題:

  1. 它在內存中維護額外的元素副本
  2. 它不會在嘗試修改迭代器中的列表時引發ConcurrentModificationException

在此處進行測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM