Преобразовать набор в список без создания нового списка - PullRequest
451 голосов
/ 17 января 2012

Я использую этот код для преобразования Set в List:

Map<String, List> mainMap = new HashMap<String, List>();

for(int i=0; i<something.size(); i++){
  Set set = getSet(...); //returns different result each time
  List listOfNames = new ArrayList(set);
  mainMap.put(differentKeyName,listOfNames);
}

Я хочу избежать создания нового списка в каждой итерации цикла.Это возможно?

Ответы [ 13 ]

1 голос
/ 02 января 2015

Я нашел, что это работает нормально и полезно для создания списка из набора.

ArrayList < String > L1 = new ArrayList < String > ();
L1.addAll(ActualMap.keySet());
for (String x: L1) {
    System.out.println(x.toString());
}
0 голосов
/ 19 февраля 2019

Ради полноты ...

Скажем, что вы действительно действительно хотите обрабатывать значения карты как списки, но вы не хотите каждый раз копировать набор в список..

Например, может быть, вы вызываете одну библиотечную функцию, которая создает набор, но вы передаете свою картурезультат (плохо спроектированная, но не в ваших руках) библиотечная функция, которая берет только картудаже если каким-то образом вы знаете , что операции, которые он выполняет со списками, в равной степени применимы к любой коллекции (и, следовательно, к любому набору).И по какой-то причине вам нужно избегать накладных расходов на скорость / память при копировании каждого набора в список.

В этом случае супер ниши, в зависимости от (возможно, непознаваемого) поведения, функция библиотекииз ваших списков, вы можете создать список для каждого набора.Обратите внимание, что это по сути небезопасно (поскольку требования библиотечной функции из каждого Списка могут предположительно измениться без вашего ведома), поэтому следует предпочесть другое решение.Но вот как вы это сделаете.

Вы создали бы класс, который реализует интерфейс List, принимает Set в конструкторе и присваивает это Set полю, а затем использует этот внутренний Set для реализацииAPI списков (насколько это возможно и желательно).

Обратите внимание, что какое-то поведение List вы просто не сможете имитировать, не сохраняя элементы в виде List, а некоторым поведением вы будете только частичноспособен подражать.Опять же, этот класс не является безопасной заменой списков в целом.В частности, если вы знаете, что для варианта использования требуются операции, связанные с индексом, или ОТКЛЮЧЕНИЕ списка, этот подход очень быстро уйдет на юг.

public class ListViewOfSet<U> implements List<U> {
    private final Set<U> wrappedSet;
    public ListViewOfSet(Set<U> setToWrap) { this.wrappedSet = setToWrap; }

    @Override public int size() { return this.wrappedSet.size(); }
    @Override public boolean isEmpty() { return this.wrappedSet.isEmpty(); }
    @Override public boolean contains(Object o) { return this.wrappedSet.contains(o); }
    @Override public java.util.Iterator<U> iterator() { return this.wrappedSet.iterator(); }
    @Override public Object[] toArray() { return this.wrappedSet.toArray(); }
    @Override public <T> T[] toArray(T[] ts) { return this.wrappedSet.toArray(ts); }
    @Override public boolean add(U e) { return this.wrappedSet.add(e); }
    @Override public boolean remove(Object o) { return this.wrappedSet.remove(o); }
    @Override public boolean containsAll(Collection<?> clctn) { return this.wrappedSet.containsAll(clctn); }
    @Override public boolean addAll(Collection<? extends U> clctn) { return this.wrappedSet.addAll(clctn); }
    @Override public boolean addAll(int i, Collection<? extends U> clctn) { throw new UnsupportedOperationException(); }
    @Override public boolean removeAll(Collection<?> clctn) { return this.wrappedSet.removeAll(clctn); }
    @Override public boolean retainAll(Collection<?> clctn) { return this.wrappedSet.retainAll(clctn); }
    @Override public void clear() { this.wrappedSet.clear(); }
    @Override public U get(int i) { throw new UnsupportedOperationException(); }
    @Override public U set(int i, U e) { throw new UnsupportedOperationException(); }
    @Override public void add(int i, U e) { throw new UnsupportedOperationException(); }
    @Override public U remove(int i) { throw new UnsupportedOperationException(); }
    @Override public int indexOf(Object o) { throw new UnsupportedOperationException(); }
    @Override public int lastIndexOf(Object o) { throw new UnsupportedOperationException(); }
    @Override public ListIterator<U> listIterator() { throw new UnsupportedOperationException(); }
    @Override public ListIterator<U> listIterator(int i) { throw new UnsupportedOperationException(); }
    @Override public List<U> subList(int i, int i1) { throw new UnsupportedOperationException(); }
}

...
Set set = getSet(...);
ListViewOfSet listOfNames = new ListViewOfSet(set);
...
0 голосов
/ 29 февраля 2012
Map<String, List> mainMap = new HashMap<String, List>();

for(int i=0; i<something.size(); i++){
  Set set = getSet(...); //return different result each time
  mainMap.put(differentKeyName, new ArrayList(set));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...