@Carl, я должен отправить набор в сторонний интерфейс, который требует список. @Tim Я хотел бы изменить сторонний интерфейс для использования Collection.
Жак Рене Месрин
1
Я вижу; за исключением любых странных ограничений, я бы пошел с ответом Роджера. Хотя, если вы на самом деле не используете список снова, я бы пропустил назначение его чему-либо (то есть, использовал бы foo.api (новый ArrayList <String> (listOfTopicAuthors)) вместо foo.api (list)).
Карл
2
@ JacquesRenéMesrine: первая строка рассматриваемого кода вводит в заблуждение: ожидается: Set<String> setOfTopicAuthors = ....актуально:Set<String> listOfTopicAuthors = ....
после этого, когда я пытался получить доступ к элементу списка, он выдавал ошибку "java.lang.ClassCastException: java.lang.Integer не может быть приведен к java.lang.String" ..don; не знаю, почему ... это простой list.get (int) это все ... есть предложения?
CoDe
2
Я полагаю, что в Java 7 и выше вы можете опустить параметр type для ArrayListвыдачи: List<String> l = new ArrayList<>(listOfTopicAuthors); наиболее кратким без использования внешней библиотеки?
Бретт Данкаваж,
Он выдаст исключение NullPointerException, если значение listOfTopicAuthorsравно нулю.
w35l3y
91
List<String> l =newArrayList<String>(listOfTopicAuthors);
за то, что он ответил в ту же минуту, что и принятый ответ, и не получил кредит. +1
джеффкай
@ Adamski Я получаю список, чей индекс начинается с 1, а не с 0, любое средство?
Джек,
1
@ Джек: Это определенно не будет иметь место. Из Javadoc из java.util.List: «Списки (например, массивы Java) основаны на нуле».
Адамски
@ Adamski Спасибо за ответ. Я знаю, что списки должны быть и основаны на нуле, поэтому это так странно для меня. После преобразования моего набора в список я не могу выполнить какую-либо итеративную операцию над ним, foreach, sort и т. Д. Я получаю исключение NullPointerException, однако, когда я ожидаю, что мой список ни один из элементов не является нулевым, и единственное, что я замечаю, это то, что индекс начинается с 1. Однако, если я просто создаю обычный список, индекс начинается с 0. Странно?
Джек,
1
@Jack: это звучит очень странно. Если вы разместите свой код в качестве отдельного вопроса, я уверен, что кто-то сможет вам помочь.
Адамски
23
Учитывая, что у нас есть, Set<String> stringSetмы можем использовать следующее:
Нет никаких гарантий относительно типа, изменчивости, сериализуемости или безопасности потока возвращаемого списка; если требуется больший контроль над возвращенным списком, используйте toCollection (Supplier).
Поэтому, если нам нужна конкретная реализация, например, ArrayListмы можем получить ее следующим образом:
Мы можем использовать Collections::unmodifiableListметод и обернуть список, возвращенный в предыдущих примерах. Мы также можем написать наш собственный метод как:
Другая возможность заключается в использовании collectingAndThenметода, который позволяет выполнить некоторое окончательное преобразование перед возвратом результата:
Следует отметить , что метод Collections::unmodifiableListвозвращает неизменяемое представление указанного списка согласно документу . Неизменяемая коллекция представлений - это коллекция, которую нельзя изменить, а также представление резервной коллекции. Обратите внимание, что изменения в резервной коллекции все еще возможны, и если они происходят, они видны через неизменяемое представление. Но метод сборщика Collectors.unmodifiableListвозвращает действительно неизменный список в Java 10 .
Я использовал это , чтобы преобразовать Set<Double>к List<Double, где множество Происходило из LinkedHashMap«S .keySet()методы. Затмение сказал мне, что было несовпадение типов, и что я не мог преобразовать из Objectв List<Double>. Не могли бы вы сказать мне, почему это могло произойти? Я обошел это путем кастинга, но мне было интересно, почему это происходит.
Ungeheuer
1
Да, поскольку разработчики Java должны использовать все больше и больше функций Java 8, этот ответ лучше, чем предыдущие 2 ответа.
Map<String,String> listOfTopicAuthors =.....// List of values:List<String> mapValueList =newArrayList<String>(listOfTopicAuthors.values());// List of keys:List<String> mapKeyList =newArrayList<String>(listOfTopicAuthors.KeySet());
java.util.Collection
: O (0)Set<String> setOfTopicAuthors = ....
актуально:Set<String> listOfTopicAuthors = ....
List<String> list = Arrays.asList(setOfTopicAuthors.toArray(String[]::new))
, подробно описано в связанном ответе.Ответы:
источник
ArrayList
выдачи:List<String> l = new ArrayList<>(listOfTopicAuthors);
наиболее кратким без использования внешней библиотеки?listOfTopicAuthors
равно нулю.источник
Учитывая, что у нас есть,
Set<String> stringSet
мы можем использовать следующее:Java 10 (неизменяемый список)
Java 8 (изменяемые списки)
Согласно документу для метода
toList()
Поэтому, если нам нужна конкретная реализация, например,
ArrayList
мы можем получить ее следующим образом:Java 8 (неизменяемые списки)
Мы можем использовать
Collections::unmodifiableList
метод и обернуть список, возвращенный в предыдущих примерах. Мы также можем написать наш собственный метод как:И затем используйте это как:
Другая возможность заключается в использовании
collectingAndThen
метода, который позволяет выполнить некоторое окончательное преобразование перед возвратом результата:Следует отметить , что метод
Collections::unmodifiableList
возвращает неизменяемое представление указанного списка согласно документу . Неизменяемая коллекция представлений - это коллекция, которую нельзя изменить, а также представление резервной коллекции. Обратите внимание, что изменения в резервной коллекции все еще возможны, и если они происходят, они видны через неизменяемое представление. Но метод сборщикаCollectors.unmodifiableList
возвращает действительно неизменный список в Java 10 .источник
Set<Double>
кList<Double
, где множество Происходило изLinkedHashMap
«S.keySet()
методы. Затмение сказал мне, что было несовпадение типов, и что я не мог преобразовать изObject
вList<Double>
. Не могли бы вы сказать мне, почему это могло произойти? Я обошел это путем кастинга, но мне было интересно, почему это происходит.Попробуйте это для Set :
Попробуйте это для карты :
источник
Если вы используете Guava, вы статически импортируете
newArrayList
метод из класса Lists :источник
не совсем уверен, что вы делаете именно через контекст вашего кода, но ...
зачем
listOfTopicAuthors
вообще делать переменную?«....» означает, что ваш набор вступил в игру, будь то новый или пришедший из другого места.
источник