Как мне создать изменяемый список на основе карты - PullRequest
0 голосов
/ 25 мая 2018

Как я могу вернуть List<E> с поддержкой Map<K, E>, если у меня есть метод для сопоставления Map значений с ключами valueToKeyMapper?

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 должен продолжать работать быстро

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Попытка использовать это List на github: ListBackedByMap.java

Используется ForwardingList для поддержания внутренней копии списка на карте.

Имеются две проблемы с этим имплементом, которые я обнаружил:

  1. Он поддерживает дополнительную копию элементов в памяти
  2. Не выдает ConcurrentModificationException при попытке изменить списокв итераторе.

Доступные тесты здесь .

0 голосов
/ 25 мая 2018

попробуйте что-то вроде этого: ---


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);
          }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...