Преобразовать набор в список без создания нового списка - 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 ]

749 голосов
/ 17 января 2012

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

List<String> mainList = new ArrayList<String>();
mainList.addAll(set);

РЕДАКТИРОВАТЬ: как ответ на редактирование вопроса.
Легко видеть, что если вы хотите иметь Map с List s в качестве значений, чтобы иметь k разных значений, вам нужно создать k разных списков.
Таким образом: Вы не можете вообще избежать создания этих списков, списки должны быть созданы.

Возможные обходные пути:
Объявите ваш Map как Map<String,Set> или Map<String,Collection> и просто вставьте ваш набор.

395 голосов
/ 29 сентября 2013

Используйте конструктор, чтобы преобразовать его:

List<?> list = new ArrayList<?>(set);
77 голосов
/ 11 июля 2013

Также из библиотеки Guava Collect вы можете использовать newArrayList(Collection):

Lists.newArrayList([your_set])

Это будет очень похоже на предыдущий ответ из amit , за исключением того, что вам не нужнообъявлять (или создавать) любой list объект.

37 голосов
/ 21 июля 2016

Мы можем использовать следующую строку в 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());
}
19 голосов
/ 10 января 2018

самое простое решение

Я хотел очень быстрый способ преобразовать мой набор в список и вернуть его, поэтому в одной строке я сделал

 return new ArrayList<Long>(mySetVariable);
6 голосов
/ 21 декабря 2015

Вы можете использовать это изменение одной строки: 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()])));
}  
4 голосов
/ 17 января 2012

Я бы сделал:

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);
}
3 голосов
/ 02 октября 2017

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 (Supplier).

Если вы хотите быть уверенным всегда, тогда вы можете запросить экземпляр, например, как:

List<String> stringArrayList = setString.stream()
                     .collect(Collectors.toCollection(ArrayList::new));
2 голосов
/ 27 декабря 2016

Недавно я нашел это:

ArrayList<T> yourList = Collections.list(Collections.enumeration(yourSet<T>));
2 голосов
/ 08 июля 2016

Я создаю простой 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...