Я использую этот код для преобразования Set
в List
:
Map<String, List<String>> mainMap = new HashMap<>();
for (int i=0; i < something.size(); i++) {
Set<String> set = getSet(...); //returns different result each time
List<String> listOfNames = new ArrayList<>(set);
mainMap.put(differentKeyName, listOfNames);
}
Я хочу избежать создания нового списка в каждой итерации цикла. Это возможно?
java
performance
list
set
Мухаммед Имран Тарик
источник
источник
Ответы:
Вы можете использовать метод List.addAll () . Он принимает коллекцию в качестве аргумента, а ваш набор является коллекцией.
РЕДАКТИРОВАТЬ: как ответить на редактирование вопроса.
Легко видеть, что если вы хотите иметь s
Map
соList
значениями s, чтобы иметь k разных значений, вам нужно создать k разных списков.Таким образом: Вы не можете избежать создания этих списков вообще, списки должны быть созданы.
Возможные
обходные пути : Объявите себя
Map
какMap<String,Set>
илиMap<String,Collection>
вместо, и просто вставьте свой набор.источник
differentKeyName
меняется каждая итерация? Вы действительно хотитеsomething.size()
разные возможные значения на ваших картах? Легко видеть, что карта соk
списками в качестве значений должна создавать как минимумk
списки.Используйте конструктор, чтобы преобразовать его:
источник
Также из библиотеки Guava Collect вы можете использовать
newArrayList(Collection)
:Это будет очень похоже на предыдущий ответ от amit , за исключением того, что вам не нужно объявлять (или создавать) какой-либо
list
объект.источник
ArrayList
конструктор.new ArrayList<>([your_set])
.Мы можем использовать следующие один вкладыш в Java 8:
Вот один маленький пример:
источник
Я хотел очень быстрый способ преобразовать мой набор в список и вернуть его, поэтому в одной строке я сделал
источник
Вы можете использовать это изменение одной строки:
Arrays.asList(set.toArray(new Object[set.size()]))
источник
Я бы сделал :
источник
Поскольку это не было упомянуто до сих пор, в Java 10 вы можете использовать новый
copyOf
метод фабрики:Из Javadoc :
источник
Java 8 предоставляет возможность использования потоков, и вы можете получить список из
Set<String> setString
:Хотя внутренняя реализация на данный момент обеспечивает экземпляр
ArrayList
:но JDK не гарантирует это. Как уже упоминалось здесь :
Если вы хотите быть уверенным всегда, тогда вы можете запросить экземпляр именно так:
источник
Я создаю простой
static
метод:... или если вы хотите установить тип списка, вы можете использовать:
источник
Недавно я нашел это:
источник
public static <T> ArrayList<T> list(Enumeration<T> e) { ArrayList<T> l = new ArrayList<>(); while (e.hasMoreElements()) l.add(e.nextElement()); return l; }
Ради полноты ...
Скажите , что вы действительно хотите , чтобы обработать
Map
значения , какList
с, но вы хотите , чтобы избежать копированияSet
вList
каждый момент времени.Например, может быть, вы вызываете одну библиотечную функцию, которая создает
Set
, но вы передаете свойMap<String, List<String>>
результат библиотечной функции (плохо спроектированной, но не в ваших руках), которая только выполняетMap<String, List<String>>
, хотя каким- то образом вы знаете, что она выполняет операции сList
s одинаково применимы к любомуCollection
(и, следовательно, к любомуSet
). И по какой-то причине вам нужно избегать накладных расходов на скорость / память при копировании каждого набора в список.В этом супер нишевом случае, в зависимости от (возможно, непознаваемого) поведения, необходимого библиотечной функции от вашего
List
, вы можете создатьList
представление для каждого набора. Обратите внимание, что это по сути небезопасно (поскольку требования библиотечной функции к каждой из нихList
могут предположительно измениться без вашего ведома), поэтому следует предпочесть другое решение. Но вот как ты это сделаешь.Вы создали бы класс, который реализует
List
интерфейс, принимаетSet
конструктор и присваивает это значение Set полю, а затем использует егоSet
для реализацииList
API (насколько это возможно и желательно).Обратите внимание, что какое-то поведение List вы просто не сможете имитировать, не сохраняя элементы как a
List
, а какое-то поведение вы сможете имитировать лишь частично. Опять же, этот класс не является безопасной заменойList
s в целом. В частности, если вы знаете, что сценарий использования требует операций, связанных с индексом, или MUTATINGList
, этот подход очень быстро уйдет на юг.источник
Я нашел это работает нормально и полезно для создания списка из набора.
источник
источник