Estou usando esse código para converter um Set
em um 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);
}
Eu quero evitar a criação de uma nova lista em cada iteração do loop. Isso é possível?
java
performance
list
set
Muhammad Imran Tariq
fonte
fonte
Respostas:
Você pode usar o método List.addAll () . Ele aceita uma coleção como argumento e seu conjunto é uma coleção.
EDIT: como responder à edição da pergunta.
É fácil ver que, se você deseja ter um
Map
comList
s como valores, para ter k valores diferentes, é necessário criar k listas diferentes.Portanto: você não pode evitar a criação dessas listas, elas deverão ser criadas.
Possível
solução alternativa : Declare seu
Map
comoMap<String,Set>
ouMap<String,Collection>
não e apenas insira seu conjunto.fonte
differentKeyName
mudando todas as iterações? Deseja realmentesomething.size()
diferentes valores possíveis em seus mapas? É fácil ver que um mapa comk
listas como valores precisa criar pelo menosk
listas.Use o construtor para convertê-lo:
fonte
Também da biblioteca Guava Collect, você pode usar
newArrayList(Collection)
:Isso seria muito semelhante à resposta anterior do amit , exceto que você não precisa declarar (ou instanciar) nenhum
list
objeto.fonte
ArrayList
construtor.new ArrayList<>([your_set])
.Podemos usar o seguinte liner no Java 8:
Aqui está um pequeno exemplo:
fonte
Eu queria uma maneira muito rápida de converter meu conjunto em Lista e devolvê-lo, então em uma linha
fonte
Você pode usar esta alteração de uma linha:
Arrays.asList(set.toArray(new Object[set.size()]))
fonte
Eu faria :
fonte
Como não foi mencionado até o momento, no Java 10 você pode usar o novo
copyOf
método de fábrica:Do Javadoc :
fonte
O Java 8 fornece a opção de usar fluxos e você pode obter uma lista
Set<String> setString
como:Embora a implementação interna a partir de agora forneça uma instância de
ArrayList
:mas o JDK não garante isso. Como mencionado aqui :
Caso você queira ter certeza sempre, poderá solicitar uma instância especificamente como:
fonte
Eu crio um
static
método simples :... ou se você deseja definir o tipo de lista, pode usar:
fonte
Recentemente eu encontrei isso:
fonte
public static <T> ArrayList<T> list(Enumeration<T> e) { ArrayList<T> l = new ArrayList<>(); while (e.hasMoreElements()) l.add(e.nextElement()); return l; }
Por uma questão de completude ...
Diga que você realmente deseja tratar os
Map
valores comoList
s, mas deseja evitar copiar os valoresSet
paraList
cada vez.Por exemplo, talvez você esteja chamando uma função de biblioteca que cria a
Set
, mas está transmitindo oMap<String, List<String>>
resultado para uma função de biblioteca (mal projetada, mas fora de suas mãos) que leva apenasMap<String, List<String>>
, embora, de alguma maneira, você saiba que as operações que realiza com oList
s são igualmente aplicáveis a qualquerCollection
(e, portanto, a qualquerSet
). E, por algum motivo, você precisa evitar a sobrecarga de velocidade / memória de copiar cada conjunto em uma lista.Nesse caso de super nicho, dependendo do comportamento (talvez incognoscível) que a função de biblioteca precisa de seus
List
s, você poderá criar umaList
visualização sobre cada conjunto. Observe que isso é inerentemente inseguro (como os requisitos de cada uma das funções da bibliotecaList
podem presumivelmente mudar sem que você saiba); portanto, outra solução deve ser preferida. Mas aqui está como você faria isso.Você criaria uma classe que implementa a
List
interface, pega umSet
no construtor e atribui esse conjunto a um campo e, em seguida, usa essa internaSet
para implementar aList
API (na medida do possível e desejada).Observe que alguns comportamentos de lista que você simplesmente não será capaz de imitar sem armazenar os elementos como a
List
, e algum comportamento que você apenas poderá imitar parcialmente. Novamente, essa classe não é um substituto seguro para oList
s em geral. Em particular, se você souber que o caso de uso requer operações relacionadas ao índice ou MUTATING theList
, essa abordagem seria muito rápida.fonte
Achei isso funcionando bem e útil para criar uma lista de um conjunto.
fonte
fonte