2012-06-13 6 views
1

То, что я пытаюсь сделать, довольно просто. Я хочу объединить две карты. SayСлияние карт в java

map1={(1,"one"),(2,"two"),(3,"three"); 
map2={(1,"onetoo"),(4,"four")}; 

, если я следовать этом->

map3.putall(map1); 
map3.putall(map2); 

затем значение 1 является onetoo но когда я следовать обратное это одно. В любом случае я могу это изменить? Что я имею в виду, так это то, что java перезаписывает и ставит только последнее значение для ключа. i.e, если onetoo был добавлен после одного (на их соответствующих картах), то независимо от того, какой порядок putall вызывает map3, значение остается onetoo.

+2

Можете ли вы привести пример карты, которую вы хотите создать? –

+1

Что вы ожидаете после слияния? – hcg

+0

Вы должны обязательно создать пример, чтобы показать, что вы имеете в виду.Но я думаю, что если вы хотите этого достичь, вам придется либо создать свой собственный «TimedMap extends Map», либо сделать это вручную, сохранив метку времени каждого 'put' с соответствующим элементом и сделав слияние, выполнив итерацию по вашим картам и добавьте только элемент, если нет записи с этим ключом и нижней меткой времени на соответствующем элементе. – brimborium

ответ

7

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

Say map1={(1,("one", 15:15)), (2, ("two", 15:16))}

Затем вы можете добавить все map1, а затем перебрать map2 добавив только, если ключ уже не там, или если она есть, но с более ранней отметкой времени.

+1

+1 за хорошую идею! – alfasin

+0

Я собираюсь пойти попробовать это. Мы обеспокоены итерационными накладными расходами, но поскольку нет выхода, это будет использовать. Спасибо за помощь. – BlahBlah

1

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

Таким образом, вы должны указать другой ключ, так как целое значение 1 имеет хэш-код из 1.

0

Ну, если ваш Programe работал, как вы хотите, то предсказать результат следующего

map3.get(1); 

Вы никогда не узнаете, является ли это «Один» или «Онтоо».

Чтобы избежать подобных проблем, Карты на Java предназначены для размещения только уникальных ключей.

Так что, если вы пишете

map3.putall(map1); 

значение 1 является "один". но как только вы напишете

map3.putall(map2); 

Значение 1 сбрасывается, и оно становится «onetoo». обратное происходит, когда вы меняете его. Возможные решения могут быть.

  1. Вставьте ключи в карты таким образом, чтобы они (ключи) однозначно идентифицировали объект. Так что всякий раз, когда в будущем вы объединяете карты, никаких конфликтов не происходит (с точки зрения двуличности) в ключах.

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

+0

слово мудрый: метод капитализируется как putAll, а не putall: https: // docs.oracle.com/javase/7/docs/api/java/util/Map.html#putAll(java.util.Map) –