Преобразовать в список без создания нового списка
Я использую этот код для преобразования Set
в List
:
Map<String, List> mainMap = new HashMap<String, List>();
for(int i=0; i<something.size(); i++){
Set set = getSet(...); //return different result each time
List listOfNames = new ArrayList(set);
mainMap.put(differentKeyName,listOfNames);
}
Я хочу избежать создания нового списка на каждой итерации цикла. Возможно ли это?
Ответы
Ответ 1
Вы можете использовать метод List.addAll(). Он принимает коллекцию в качестве аргумента, а ваш набор - это коллекция.
mainList.addAll(set);
ИЗМЕНИТЬ: в ответ на редактирование вопроса.
Легко видеть, что если вы хотите иметь Map
с List
как значения, чтобы иметь k разных значений, вам нужно создать k разных списков.
Таким образом: вы не можете вообще не создавать эти списки, списки должны быть созданы.
Возможная работа вокруг:
Объявите свой Map
как Map<String,Set>
или Map<String,Collection>
вместо этого и просто вставьте свой набор.
Ответ 2
Используйте конструктор для его преобразования:
List<?> list = new ArrayList<?>(set);
Ответ 3
Также из библиотеки Guava Collect вы можете использовать newArrayList(Collection)
:
Lists.newArrayList([your_set])
Это будет очень похоже на предыдущий ответ от amit, за исключением того, что вам не нужно объявлять (или инициализировать) любой объект list
.
Ответ 4
Мы можем использовать следующий один лайнер в Java 8:
List<String> list = set.stream().collect(Collectors.toList());
Вот небольшой пример:
public static void main(String[] args) {
Set<String> set = new TreeSet<>();
set.add("A");
set.add("B");
set.add("C");
List<String> list = set.stream().collect(Collectors.toList());
}
Ответ 5
Я бы сделал:
Map<String, Collection> mainMap = new HashMap<String, Collection>();
for(int i=0; i<something.size(); i++){
Set set = getSet(...); //return different result each time
mainMap.put(differentKeyName,set);
}
Ответ 6
Вы можете использовать это однострочное изменение: Arrays.asList(set.toArray(new Object[set.size()]))
Map<String, List> mainMap = new HashMap<String, List>();
for(int i=0; i<something.size(); i++){
Set set = getSet(...);
mainMap.put(differentKeyName, Arrays.asList(set.toArray(new Object[set.size()])));
}
Ответ 7
Недавно я нашел это
ArrayList<T> yourList = Collections.list(Collections.enumeration(yourSet<T>));
Ответ 8
Я создаю простой метод static
:
public static <U> List<U> convertSetToList(Set<U> set)
{
return new ArrayList<U>(set);
}
... или если вы хотите установить тип списка, который вы можете использовать:
public static <U, L extends List<U>> List<U> convertSetToList(Set<U> set, Class<L> clazz) throws InstantiationException, IllegalAccessException
{
L list = clazz.newInstance();
list.addAll(set);
return list;
}
Ответ 9
Я нашел эту работу прекрасной и полезной для создания списка из набора.
ArrayList < String > L1 = new ArrayList < String > ();
L1.addAll(ActualMap.keySet());
for (String x: L1) {
System.out.println(x.toString());
}
Ответ 10
Java 8 предоставляет возможность использования потоков, и вы можете получить список из Set<String> setString
как:
List<String> stringList = setString.stream().collect(Collectors.toList());
Хотя внутренняя реализация на данный момент предоставляет экземпляр ArrayList
:
public static <T>
Collector<T, ?, List<T>> toList() {
return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
(left, right) -> { left.addAll(right); return left; },
CH_ID);
}
но JDK не гарантирует этого. Как упоминалось здесь:
Нет никаких гарантий относительно типа, изменчивости, сериализуемости или безопасность потока возвращаемого списка; если больше контроля над возвращенным Список необходим, используйте toCollection (Поставщик).
Если вы хотите быть уверенным всегда, то вы можете запросить экземпляр специально как:
List<String> stringArrayList = setString.stream()
.collect(Collectors.toCollection(ArrayList::new));
Ответ 11
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));
}