Java - удалить последний известный элемент из HASHMAP на MAP! S - PullRequest
3 голосов
/ 18 августа 2010

ОК, так что это немного по-другому. У меня есть новый HashMap

private Map<String, Player> players = new HashMap<String, Player>();

Как мне удалить последний известный предмет из этого? Может быть, что-то подобное?

hey = Player.get(players.size() - 1);
Player.remove(hey);

Ответы [ 8 ]

6 голосов
/ 18 августа 2010

Проблема в том, что HashMap не сортируется как список.Внутренний порядок зависит от значения ключа hashCode () (например, String).Вы можете использовать LinkedHashMap, который сохраняет порядок вставки.Чтобы удалить последнюю запись, вы можете использовать итератор в сочетании со счетчиком, который сравнивается с размером и удаляет последнюю запись.Попробуйте это:

Map<String, Player> players = new LinkedHashMap<String, Players>();
List<String> list = new ArrayList<String>(players.keySet());
map.remove(list.get(list.size()-1));
4 голосов
/ 18 августа 2010

Я немного растерялся.Прежде всего, вы говорите, что у вас есть новый ArrayList, и вы иллюстрируете это строкой, которая создает новый HashMap.Во-вторых, действительно ли класс Player имеет статические методы, такие как get(int) и remove(Object)?

HashMap, не имеет определенного порядка, ArrayList (как любойдругие List) делает.

Удаление из ArrayList

Если у вас есть список игроков, то вы можете сделать следующее:

private List<Player> players = new ArrayList<Player>();
// Populate the list of players
players.remove(players.size() - 1);

Здесь я использовал remove(int) метод List, который позволяет удалить элемент с произвольным индексом.

Удаление из HashMap

Если у вас есть карта игроков, нет такой вещи, как «последний предмет».Конечно, вы можете перемещаться по карте, и один из элементов появится последним, но это ничего не значит.Поэтому сначала вы должны выяснить, что вы хотите удалить.Затем вы можете сделать следующее:

private Map<String, Player> players = new HashMap<String, Player>();
// Populate the map of players
// Find the key of the player to remove
players.remove(toRemove);

Здесь я использовал remove(Object) метод Map.Обратите внимание, что для удаления некоторой пары ключ-значение необходимо указать ключ, а не значение.

2 голосов
/ 18 августа 2010

В HashMap нет «первого» и «последнего». Это неупорядочено. Все доступно по ключу, а не по индексу.

1 голос
/ 19 августа 2010

Вы не можете удалить из HashMap таким образом. Вам нужно использовать LinkedHashMap .

1 голос
/ 18 августа 2010

Просто, просто сделайте что-нибудь с этим эффектом.

1) Получите итератор набора ключей;2) Создать Key somelastKey = null3) Выполните итерацию через итератор и присвойте somelastKey, пока итератор не завершит работу.4) наконец, выполните players.remove(somelastKey);

Имейте в виду, что HashMap неупорядочен, для определения порядка вставки зависит hashCode объекта.

Вместо использования HashMap, попробуйте использовать LinkedHashMapкоторый поддерживает предсказуемый порядок итераций.

Надеюсь, это поможет ....

0 голосов
/ 19 августа 2010

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

Привыкайте собирать коллекции в классы бизнес-логики.

Видите ли, в вашем случае прямо сейчас вам нужно связать эти две связанные переменные - вашу хэш-карту и элемент "Последний ввод", чтобы вы могли удалить его.

Если вам нужно удалить последний элемент из какого-либо другого класса, вам нужно пропустить оба элемента.

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

Создайте новый класс, который содержит hashmap и переменную «lastAdded». Методы put и remove, которые просто перенаправляются в хэш-карту, но метод put также устанавливает переменную lastAdded.

Также обязательно добавьте метод removeLast ().

НИКОГДА не разрешайте доступ к вашей хэш-карте за пределами этого класса, она должна быть полностью закрытой (это я и имею в виду под оболочкой). Таким образом вы можете быть уверены, что он не синхронизируется с переменной lastAdded (также полностью закрытой).

Просто повторять методы получения и установки для этих переменных было бы ужасной идеей (так как они имеют почти весь фактический OO-код).

Вы быстро найдете множество других методов, которые ДОЛЖНЫ быть в этом классе, чтобы получить доступ к данным внутри вашей хэш-карты - методы, которые никогда не чувствовали себя в своем текущем местоположении. Вы, вероятно, также заметите, что эти методы всегда имеют дополнительный параметр или два переданных - эти параметры, вероятно, должны быть членами вашего нового класса.

Как только вы привыкнете к реальному проектированию ОО (в данном случае через рефакторинг), вы обнаружите, что ваш код НАМНОГО более управляем. Чтобы проиллюстрировать этот момент, если позже вы обнаружите, что вам нужно несколько уровней «удалить последний», добавьте в свой класс ТРИВАЛЬНО, потому что будет предельно ясно, какие именно методы могут изменить вашу хеш-таблицу и где ваш новый «стек» lastItems должен быть расположен - на самом деле это, вероятно, изменение в 2 строки кода.

Если вы не создадите этот класс-обертку, в каждом месте будет код для установки «lastAdded» при добавлении кода в хеш-таблицу. Каждое из этих мест должно быть изменено, некоторые могут быть в других классах, требующих, чтобы вы передали свой новый стек с хеш-таблицей. Будет проще отключить их, если вы забудете сменить одно местоположение.

0 голосов
/ 18 августа 2010

При добавлении:

String key; Player value;
lastKey = key;
map.put(key, value);

//...later...
Player lastAdded = map.remove(lastKey);

Кроме этого, на самом деле нет никакого способа без использования LinkedHashMap или какого-либо создания собственной карты-оболочки или расширения HashMap.

0 голосов
/ 18 августа 2010

Вам, вероятно, придется расширить HashMap, переопределить put, чтобы он кэшировал ключ, а затем создать новый метод, который просто удаляет кэшированный ключ.

К сожалению, это позволит толькоВы удаляете последнее добавленное.Если вам нужно удалить последнее добавленное несколько раз (без вставки промежуточных удалений), вам не повезло.

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

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