Criar ArrayList de gama
-
03-07-2019 - |
Pergunta
Eu tenho uma matriz que é inicializado como:
Element[] array = {new Element(1), new Element(2), new Element(3)};
Gostaria de converter essa matriz em um objeto da classe ArrayList.
ArrayList<Element> arraylist = ???;
Solução
new ArrayList<>(Arrays.asList(array))
Outras dicas
Dada:
Element[] array = new Element[] { new Element(1), new Element(2), new Element(3) };
A resposta mais simples é fazer:
List<Element> list = Arrays.asList(array);
Este belo trabalho vontade. Mas algumas ressalvas:
- A lista retornada de asList tem tamanho fixo . Então, se você quer ser capaz de adicionar ou remover elementos da lista retornada no seu código, você precisa envolvê-la em uma nova
ArrayList
. Caso contrário, você vai ter umaUnsupportedOperationException
. - A lista retornada de
asList()
é apoiado pela matriz original. Se você modificar a matriz original, a lista será modificado também. Isso pode ser surpreendente.
(discussão antiga, mas apenas 2 centavos como nenhum menção goiaba ou outros libs e alguns outros detalhes)
Se puder, use Goiaba
É de salientar a forma como goiaba, o que simplifica essas travessuras:
Uso
Para uma lista Imutável
Use a ImmutableList
classe e sua of()
e copyOf()
métodos de fábrica (elementos não pode ser nulo) :
List<String> il = ImmutableList.of("string", "elements"); // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array
Para obter uma lista mutável
Use a Lists
classe e sua newArrayList()
métodos de fábrica:
List<String> l1 = Lists.newArrayList(anotherListOrCollection); // from collection
List<String> l2 = Lists.newArrayList(aStringArray); // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs
Observe também os métodos semelhantes para outras estruturas de dados em outras classes, por exemplo em Sets
.
Por goiaba?
A principal atração pode ser o de reduzir a desordem devido aos genéricos para o Tipo-segurança, como o uso da Guava métodos de fábrica permitem os tipos de ser inferida a maior parte do tempo. No entanto, este argumento detém menos água desde Java 7 chegou com o novo operador de diamante.
Mas não é a única razão (e Java 7 não é em todos os lugares ainda): a sintaxe abreviada também é muito útil, e os initializers métodos, como visto acima, permitem escrever código mais expressivo. Você faz em uma chamada de goiaba que leva 2 com os atuais coleções de Java.
Se você não pode ...
Para uma lista Imutável
Arrays
classe Uso do JDK e sua asList()
método de fábrica, envolvida com uma Collections.unmodifiableList()
:
List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));
Note que o tipo retornado para asList()
é um List
usando uma implementação concreta ArrayList
, mas Não é java.util.ArrayList
. É um tipo de interior, que emula um ArrayList
mas na verdade faz referência direta a matriz passada e torna "write through" (modificações são refletidas na matriz).
Ela proíbe modificações através de alguns dos métodos a List
da API por meio de simplesmente estender um AbstractList
(assim, adicionando ou removendo elementos não é suportado), no entanto, permite que as chamadas para set()
para elementos de substituição. Assim, esta lista não é verdadeiramente imutável e uma chamada para asList()
devem ser embrulhados com Collections.unmodifiableList()
.
Veja o passo seguinte se você precisa de uma lista mutável.
Para obter uma lista mutável
O mesmo que acima, mas envolvido com uma java.util.ArrayList
real:
List<String> l1 = new ArrayList<String>(Arrays.asList(array)); // Java 1.5 to 1.6
List<String> l1b = new ArrayList<>(Arrays.asList(array)); // Java 1.7+
List<String> l2 = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6
List<String> l2b = new ArrayList<>(Arrays.asList("a", "b")); // Java 1.7+
para fins educacionais: The Good ol' Way manual
// for Java 1.5+
static <T> List<T> arrayToList(final T[] array) {
final List<T> l = new ArrayList<T>(array.length);
for (final T s : array) {
l.add(s);
}
return (l);
}
// for Java < 1.5 (no generics, no compile-time type-safety, boo!)
static List arrayToList(final Object[] array) {
final List l = new ArrayList(array.length);
for (int i = 0; i < array.length; i++) {
l.add(array[i]);
}
return (l);
}
Uma vez que esta questão é muito velho, ele me surpreende que ninguém sugeriu a forma mais simples ainda:
List<Element> arraylist = Arrays.asList(new Element(1), new Element(2), new Element(3));
A partir do Java 5, Arrays.asList()
leva um varargs parâmetro e você não tem que construir a matriz explicitamente.
new ArrayList<T>(Arrays.asList(myArray));
Certifique-se de que myArray
é do mesmo tipo que T
. Você obterá um erro do compilador se você tentar criar um List<Integer>
entre uma variedade de int
, por exemplo.
Uma outra forma (embora essencialmente equivalente à solução new ArrayList(Arrays.asList(array))
em termos de performance:
Collections.addAll(arraylist, array);
Java 9
Na Java 9 , você pode usar List.of
método de fábrica estático, a fim de criar um literal List
. Algo como o seguinte:
List<Element> elements = List.of(new Element(1), new Element(2), new Element(3));
Esta retornaria um imutável lista contendo três elementos. Se você quer uma mutável lista, passar essa lista para o construtor ArrayList
:
new ArrayList<>(List.of(// elements vararg))
PEC 269: métodos de fábrica de conveniência para coleções
PEC 269 fornece alguns métodos de conveniência de fábrica para Java Collections API. Estes métodos de fábrica estáticos imutáveis ??são incorporadas ao List
, Set
, e Map
as interfaces em Java 9 e posterior.
Você provavelmente só precisa de uma lista, não um ArrayList. Nesse caso, você pode simplesmente fazer:
List<Element> arraylist = Arrays.asList(array);
Outra atualização, quase terminando o ano de 2014, você pode fazê-lo com Java 8 demasiado:
ArrayList<Element> arrayList = Stream.of(myArray).collect(Collectors.toCollection(ArrayList::new));
Alguns personagens seriam salvos, se este poderia ser apenas um List
List<Element> list = Stream.of(myArray).collect(Collectors.toList());
Se você usar:
new ArrayList<T>(Arrays.asList(myArray));
você pode criar e preencher duas listas! Encher duas vezes uma grande lista é exatamente o que você não quer fazer porque vai criar outra matriz Object[]
cada vez que as necessidades de capacidade para ser estendido.
Felizmente a implementação JDK é rápido e Arrays.asList(a[])
é muito bem feito. É criar uma espécie de ArrayList chamado Arrays.ArrayList onde o objeto [] pontos de dados diretamente para a matriz.
// in Arrays
@SafeVarargs
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
//still in Arrays, creating a private unseen class
private static class ArrayList<E>
private final E[] a;
ArrayList(E[] array) {
a = array; // you point to the previous array
}
....
}
O lado perigoso é que se você muda a matriz inicial, você alterar a lista! Você tem certeza que quer isso? Talvez sim, talvez não.
Se não, a forma mais compreensível é fazer isso:
ArrayList<Element> list = new ArrayList<Element>(myArray.length); // you know the initial capacity
for (Element element : myArray) {
list.add(element);
}
Ou, como disse @glglgl, você pode criar outro ArrayList independente com:
new ArrayList<T>(Arrays.asList(myArray));
Gosto de usar Collections
, Arrays
, ou goiaba. Mas se ele não se encaixam, ou você não sente isso, basta escrever uma outra linha deselegante vez.
Em Java 9
você pode usar:
List<String> list = List.of("Hello", "World", "from", "Java");
List<Integer> list = List.of(1, 2, 3, 4, 5);
De acordo com a pergunta a resposta usando java 1.7 é:
ArrayList<Element> arraylist = new ArrayList<Element>(Arrays.<Element>asList(array));
No entanto, é sempre melhor usar a interface:
List<Element> arraylist = Arrays.<Element>asList(array);
// Guava
import com.google.common.collect.ListsLists
...
List<String> list = Lists.newArrayList(aStringArray);
Você pode converter usando métodos diferentes
-
List<Element> list = Arrays.asList(array);
-
List<Element> list = new ArrayList();
Collections.addAll(list, array); -
Arraylist list = new Arraylist();
list.addAll(Arrays.asList(array));
Para mais detalhes você pode consultar a http : //javarevisited.blogspot.in/2011/06/converting-array-to-arraylist-in-java.html
como todos disseram isso vai fazê-lo
new ArrayList<>(Arrays.asList("1","2","3","4"));
e a mais nova forma comum de criar matriz é observableArrays
ObservableList:. Uma lista que permite que os ouvintes para acompanhar as mudanças quando ocorrem
para Java SE você pode tentar
FXCollections.observableArrayList(new Element(1), new Element(2), new Element(3));
que está de acordo com a a Oracle Docs
observableArrayList () Cria uma nova lista observável vazio que é apoiado por um ArrayList. observableArrayList (E ... items) Cria uma nova lista de matriz observável com itens adicionados a ele.
Java Update 9
também em Java 9 é um pouco fácil:
List<String> list = List.of("element 1", "element 2", "element 3");
Você também pode fazê-lo com fluxo em Java 8.
List<Element> elements = Arrays.stream(array).collect(Collectors.toList());
Desde Java 8 existe uma maneira mais fácil de transformar:
public static <T> List<T> fromArray(T[] array) {
return Arrays.stream(array).collect(toList());
}
-
Se formos ver a definição de método
Arrays.asList()
você terá algo parecido com isto:public static <T> List<T> asList(T... a) //varargs are of T type.
Assim, você pode inicializar
arraylist
assim:List<Element> arraylist = Arrays.asList(new Element(1),new Element(2),new Element(3));
Nota ??forte>:. Cada new Element(int args)
vai ser tratado como objecto individual e pode ser transmitido como umvar-args
-
Pode haver outra resposta para esta pergunta também.
Se você ver declaração para o métodojava.util.Collections.addAll()
você terá algo parecido com isto:public static <T> boolean addAll(Collection<? super T> c, T... a);
Assim, este código também é útil fazê-lo
Collections.addAll(arraylist, array);
Outra forma simples é adicionar todos os elementos da matriz para um novo ArrayList usando um for-each loop.
ArrayList<Element> list = new ArrayList<>();
for(Element e : array)
list.add(e);
Se a matriz é de um tipo primitivo, as respostas dadas não vai funcionar. Mas desde Java 8 você pode usar:
int[] array = new int[5];
Arrays.stream(array).boxed().collect(Collectors.toList());
Podemos facilmente converter um array para ArrayList
.
Usamos método addAll()
de interface de coleção com a finalidade de copiar o conteúdo de uma lista para outra.
Arraylist arr = new Arraylist();
arr.addAll(Arrays.asList(asset));
Embora existam muitas respostas perfeitamente escritos a esta pergunta, vou acrescentar minhas entradas.
Digamos que você tenha Element[] array = { new Element(1), new Element(2), new Element(3) };
New ArrayList pode ser criado no seguinte maneiras
ArrayList<Element> arraylist_1 = new ArrayList<>(Arrays.asList(array));
ArrayList<Element> arraylist_2 = new ArrayList<>(
Arrays.asList(new Element[] { new Element(1), new Element(2), new Element(3) }));
// Add through a collection
ArrayList<Element> arraylist_3 = new ArrayList<>();
Collections.addAll(arraylist_3, array);
E eles muito bem suportar todas as operações de ArrayList
arraylist_1.add(new Element(4)); // or remove(): Success
arraylist_2.add(new Element(4)); // or remove(): Success
arraylist_3.add(new Element(4)); // or remove(): Success
Mas as operações seguintes retorna apenas uma exibição de lista de um ArrayList real ArrayList e não.
// Returns a List view of array and not actual ArrayList
List<Element> listView_1 = (List<Element>) Arrays.asList(array);
List<Element> listView_2 = Arrays.asList(array);
List<Element> listView_3 = Arrays.asList(new Element(1), new Element(2), new Element(3));
Por isso, eles vão dar erro ao tentar fazer algumas operações ArrayList
listView_1.add(new Element(4)); // Error
listView_2.add(new Element(4)); // Error
listView_3.add(new Element(4)); // Error
Mais sobre representação Lista de gama ligação .
Mais simples maneira de fazer isso é através da adição de código a seguir. Experimentado e testado.
String[] Array1={"one","two","three"};
ArrayList<String> s1= new ArrayList<String>(Arrays.asList(Array1));
Outra solução Java8 (eu possa ter perdido a resposta entre o grande conjunto. Se assim for, as minhas desculpas). Isto cria um ArrayList (em oposição a uma lista), ou seja se pode excluir elementos
package package org.something.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Junk {
static <T> ArrayList<T> arrToArrayList(T[] arr){
return Arrays.asList(arr)
.stream()
.collect(Collectors.toCollection(ArrayList::new));
}
public static void main(String[] args) {
String[] sArr = new String[]{"Hello", "cruel", "world"};
List<String> ret = arrToArrayList(sArr);
// Verify one can remove an item and print list to verify so
ret.remove(1);
ret.stream()
.forEach(System.out::println);
}
}
A saída é ...
Olá
world
Você pode fazer isso em java 8 como segue
ArrayList<Element> list = (ArrayList<Element>)Arrays.stream(array).collect(Collectors.toList());
Já todos forneceu resposta boa o suficiente para o seu problema. Agora, a partir das todas as sugestões, você precisa decidir qual vai caber sua exigência. Existem dois tipos de coleção que você precisa saber. Uma é a coleta não modificada e outra coleção um que lhe permitirá modificar o objeto mais tarde.
Então, aqui vou dar curto exemplo para dois casos de uso.
-
criação coleção Imutável :: Quando você não quiser modificar o objeto de coleção após a criação
List<Element> elementList = Arrays.asList(array)
-
criação coleta Mutante :: Quando você pode querer modificar o objeto coleção criada após a criação.
List<Element> elementList = new ArrayList<Element>(Arrays.asList(array));
Use o seguinte código para converter uma matriz elemento em um ArrayList.
Element[] array = {new Element(1), new Element(2), new Element(3)};
ArrayList<Element>elementArray=new ArrayList();
for(int i=0;i<array.length;i++) {
elementArray.add(array[i]);
}
Você pode criar um ArrayList
usando Cactoos (eu sou um dos desenvolvedores):
List<String> names = new StickyList<>(
"Scott Fitzgerald", "Fyodor Dostoyevsky"
);
Não há garantia de que o objeto vai ser realmente de ArrayList
classe. Se você precisar essa garantia, faça o seguinte:
ArrayList<String> list = new ArrayList<>(
new StickyList<>(
"Scott Fitzgerald", "Fyodor Dostoyevsky"
)
);
Use o código abaixo
Element[] array = {new Element(1), new Element(2), new Element(3)};
ArrayList<Element> list = (ArrayList) Arrays.asList(array);
Esta é uma maneira clara para que
ArrayList<Element> arraylist = new ArrayList<>(Arrays.asList(array))