Java build List из значений нескольких карт в определенном порядке - PullRequest
1 голос
/ 25 января 2011

Предположим, у вас есть список целых чисел в значимом порядке (List1).

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

Как вы можете построить новый Список объектов из двух Карт, в которых Объекты отображаются в том порядке, в котором их Integer-ключ появляется в List1?

Ответы [ 4 ]

2 голосов
/ 25 января 2011

Вы можете сделать это довольно просто с помощью цикла:

Map map1;
Map map2;
List list2;
// iterate through all of the possible keys in order
for(Object possibleKey: List1) {
    // If the possible ke is a key in one of the maps,
    // add it to your new list.  This will preserve order.
    if(map1.containsKey(possibleKey))
        list2.add(map1.get(possibleKey));
    else if (map2.containsKey(possibleKey))
        list2.add(map2.get(possibleKey));
}

Приведенный выше код упрощен, но вы должны получить общее представление.

1 голос
/ 25 января 2011
List<MyObj> l = new ArrayList<MyObj>();
for(Integer i: list1)
   MyObj o = (map1.containsKey(i))?map1.get(i):map2.get(i);
   if(o!=null)
     l.add(o);

Обновлен с помощью containsKey, кажется фантастическим.

1 голос
/ 25 января 2011
  1. Создайте список для ваших объектов.
  2. Прокрутите список и проверьте на обеих картах объект.
  3. На какой карте есть совпадение, добавьте этот объект в ваш новый список.
0 голосов
/ 25 января 2011

Используйте SortedMap:

Приятной особенностью SortedMap является то, что все ее представления коллекции а) отсортированы и б) поддерживается картой, что позволяет очень легко ограничить значения карты теми, которые указаны в списке, и получить значения в правильном порядке:

// create a SortedMap
SortedMap<Integer,Object> sortedMap = new TreeMap<Integer, Object>();
// add the entries of the first map
sortedMap.putAll(map1);
// add the entries of the second map
// (all entries are now sorted by key)
sortedMap.putAll(map2);
// now remove all entries that are not in List1
sortedMap.keySet().retainAll(list1);
// and here's your list of the values, sorted by key
List<Object> arrayList = new ArrayList<Object>(sortedMap.values());

Справка:

SortedMap.keySet(): возвращает набор вид ключей, содержащихся в этом карта. Итератор набора возвращает ключи в порядке возрастания. Набор опираясь на карту, поэтому изменения в карта отражается в наборе и наоборот . [...] Набор поддерживает удаление элемента, который удаляет соответствующее отображение с карты, через [...] сохранить все и очистить операции.

Set.retainAll(): сохраняет только элементы в этом наборе, которые содержится в указанной коллекции (необязательная операция). Другими словами, удаляет из этого набора все свои элементы, которые не содержатся в указанная коллекция .

SortedMap.values(): Возвращает Collection представление значения, содержащиеся в этой карте. итератор коллекции возвращает значения в порядке возрастания соответствующие ключи . Коллекция опираясь на карту, поэтому изменения в карта отражена в коллекции, и наоборот.

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