Pergunta

tenho uma HashSet<Integer> com um monte de Integers iniciar. Eu quero transformá -lo em uma matriz, mas chamando

hashset.toArray();

retorna um Object[]. Existe uma maneira melhor de lançá -lo para uma variedade de int Além de iterar todos os elementos manualmente? Eu quero passar a matriz para

void doSomething(int[] arr)

que não aceitará a matriz do objeto [], mesmo que eu tente lançá -la como

doSomething((int[]) hashSet.toArray());
Foi útil?

Solução

Apache's Arrayutils tem isso (ainda itera Por trás das cenas):

doSomething(ArrayUtils.toPrimitive(hashset.toArray()));

Eles são sempre um bom lugar para verificar se há coisas assim.

Outras dicas

Você pode criar um int[] De qualquer Collection<Integer> (incluindo um HashSet<Integer>) Usando java 8 fluxos:

int[] array = coll.stream().mapToInt(Number::intValue).toArray();

A biblioteca ainda está iterando a coleção (ou outra fonte de fluxo) em seu nome, é claro.

Além de ser conciso e não ter dependências externas da biblioteca, os fluxos também permitem que você vá paralelo se você tiver uma coleção realmente grande para copiar.

public int[] toInt(Set<Integer> set) {
  int[] a = new int[set.size()];
  int i = 0;
  for (Integer val : set) a[i++] = val;
  return a;
}

Agora que escrevi o código para você, não é mais esse manual, é? ;)

Você pode converter um Set<Integer> para Integer[] Mesmo sem os utilitários do Apache:

Set<Integer> myset = new HashSet<Integer>();
Integer[] array = myset.toArray(new Integer[0]);

No entanto, se você precisar int[] Você tem que iterar sobre o conjunto.

Você pode simplesmente usar a goiaba:

Ints.toArray(Collection<? extends Number> collection)

Não; Você precisa iterar sobre eles. Desculpe.

Tente isso. Usando Java 8.

    Set<Integer> set = new HashSet<>();
    set.add(43);
    set.add(423);
    set.add(11);
    set.add(44);
    set.add(56);
    set.add(422);
    set.add(34);
    int[] arr = set.stream().mapToInt(Integer::intValue).toArray();

Você também pode usar a variante ToArray (t [] conteúdo) do método TOARRAY (). Crie uma variedade vazia de INTs do mesmo tamanho que o hashset e depois passe -o para o método TOARRAY ():

Integer[] myarray = new Integer[hashset.size()];
doSomething(hashset.toArray(myarray));

Você teria que mudar o doSomething() função para aceitar um Integer[] matriz em vez de int[]. Se isso não for viável, você converteria a matriz de valores retornados por toArray para int[].

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top