Какой самый быстрый способ удалить элемент из карты по значению в Java? - PullRequest
32 голосов
/ 26 августа 2009

Какой самый быстрый способ удалить элемент с карты по значению в Java?

В настоящее время я использую:

    DomainObj valueToRemove = new DomainObj();
    String removalKey = null;

    for (Map.Entry<String, DomainObj> entry : map.entrySet()) {
        if (valueToRemove.equals(entry.getValue())) {
            removalKey = entry.getKey();
            break;
        }
    }

    if (removalKey != null) {
        map.remove(removalKey);
    }

Ответы [ 12 ]

1 голос
/ 22 ноября 2009

Мы знаем, что такая ситуация возникает редко, но она чрезвычайно полезна. Я предпочитаю BidiMap из org.apache.commons.collections .

0 голосов
/ 26 августа 2009

Я не думаю, что это произойдет только один раз в жизни вашего приложения.

Итак, я бы передал другому объекту ответственность за поддержание ссылки на объекты, добавленные на эту карту.

Так что в следующий раз, когда вам нужно будет удалить его, вы используете эту «обратную карту» ...

 class MapHolder { 

     private Map<String, DomainObj> originalMap;
     private Map<DomainObj,String> reverseMap;

     public void remove( DomainObj value ) {
           if ( reverseMap.contains( value ) ) { 
                 originalMap.remove( reverseMap.get( value ) );
                 reverseMap.remove( value );
           }
     }
  }

Это намного быстрее, чем итерация.

Очевидно, вам нужно синхронизировать их. Но это не должно быть так сложно, если вы изменяете код, чтобы один объект отвечал за состояние карты.

Помните, что в ООП у нас есть объекты, которые имеют состояние и поведение. Если ваши данные передают переменные повсеместно, вы создаете ненужные зависимости между объектами

Да, вам потребуется некоторое время, чтобы исправить код, но время, потраченное на его исправление, избавит вас от многих головных болей в будущем. Думаю об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...