Como posso adicionar itens dinamicamente a um array Java?

86

Em PHP, você pode adicionar elementos dinamicamente a matrizes da seguinte maneira:

$x = new Array();
$x[] = 1;
$x[] = 2;

Depois disso, $xseria uma matriz como este: {1,2}.

Existe uma maneira de fazer algo semelhante em Java?

kamikaze_pilot
fonte
4
Para todas as respostas abaixo, usa ArrayList, mas OP pede especificamente por Array. eu gostaria de saber melhor.
KJYe.Name 葉家仁
4
a resposta é 'Não'. Você deve especificar o tamanho da matriz (ou preencher todos os elementos) no momento da declaração / criação em Java. Consulte java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
Ritesh
Notei que vários arrays de retorno de função Java, então olhei para a implementação de list (filter) em File.java. Ele usa uma Lista internamente e a converte em uma matriz no final. List <String> v = new ArrayList <> (); ... return v.toArray (new String [v.size ()]);
xtempore

Respostas:

112

Olhe para java.util.LinkedList ou java.util.ArrayList

List<Integer> x = new ArrayList<Integer>();
x.add(1);
x.add(2);
CorsiKa
fonte
21
Esta é uma resposta perfeita, exceto por uma peça. Normalmente, em Java, usamos apenas List em vez de arrays primitivos, mas para instâncias onde você realmente precisa de um array primitivo (como int[]), apenas use o toArray()método em List. Use o código acima, mas use x.toArray()para obter um Array primitivo.
rharter 01 de
1
Em 99% dos casos (mais como 99,99999% dos casos), se você realmente precisa de um array primitivo, você está fazendo algo errado e deve ser tratado com princípios OO. A menos que você esteja fazendo interface com código nativo, ou algo como ARRAYobjetos Oracle ou alguma bobagem assim, é muito melhor evitar matrizes primitivas.
corsiKa 01 de
11
ah, todos esses comentários sobre como você não deveria usar matrizes primitivas, se fosse assim tão fácil :(
thecoshman
1
@trusktr Essa é uma razão para fazer isso. Neste exemplo, é mais parecido com ... usar uma Listreferência nos permite chutar ArrayListpara o meio-fio a qualquer hora que quisermos. Se alguém lançar uma lista melhor, como SuperDuperAwesomeList, talvez tenhamos muito trabalho a fazer se fizermos nossa referência a ArrayList. ArrayList tem coisas que List não tem. Se dependermos dessas coisas em nosso código, será muito mais difícil fazer a troca.
corsiKa
1
@corsiKa, escreva alguns algoritmos de compressão / codificação sem primitivas e esses casos são muito mais comuns do que 99. (9). Маtrix impls scream primitivs também. Por outro lado, se você interagir com o código nativo, você usa DirectBuffers, não matrizes primitivas. No final, alguém tem que trabalhar, se você está preso a bancos de dados e apresentação, tudo bem, mas a afirmação de 99% é simplesmente boba.
bestsss
65

Os arrays em Java têm um tamanho fixo, portanto você não pode "adicionar algo no final" como faria em PHP.

Um pouco semelhante ao comportamento do PHP é este:

int[] addElement(int[] org, int added) {
    int[] result = Arrays.copyOf(org, org.length +1);
    result[org.length] = added;
    return result;
}

Então você pode escrever:

x = new int[0];
x = addElement(x, 1);
x = addElement(x, 2);

System.out.println(Arrays.toString(x));

Mas esse esquema é terrivelmente ineficiente para arrays maiores , pois faz uma cópia de todo o array a cada vez. (E na verdade não é completamente equivalente ao PHP, já que seus arrays antigos permanecem os mesmos).

Os arrays PHP são na verdade exatamente iguais a um HashMap Java com uma "chave máxima" adicionada, então ele saberia qual chave usar a seguir e uma ordem de iteração estranha (e uma estranha relação de equivalência entre chaves inteiras e algumas Strings). Mas para coleções indexadas simples, é melhor usar uma lista em Java, como os outros respondentes propostos.

Se você quiser evitar o uso Listdevido à sobrecarga de agrupar cada int em um inteiro, considere o uso de reimplementações de coleções para tipos primitivos, que usam arrays internamente, mas não farão uma cópia em cada mudança, apenas quando o array interno estiver cheio ( assim como ArrayList). (Um exemplo pesquisado rapidamente é esta classe IntList .)

Goiaba contém métodos de criação de tais embalagens em Ints.asList, Longs.asListetc.

Paŭlo Ebermann
fonte
é muito mais inteligente do que a solução aceita. nenhum objeto desperdiçado.
névoa
2
@Mihail: Na verdade, normalmente não recomendo fazer isso, já que para cada adição de um elemento, um novo array é criado e todo o conteúdo copiado. (No entanto, depende do seu caso de uso - se você raramente adiciona / remove algo, e frequentemente itera / pesquisa, pode estar tudo bem.)
Paŭlo Ebermann
ArrayUtils nas versões mais recentes tem um método que faz isso. Estou com preguiça de verificar a implementação, mas tenho quase certeza de que eles escreveram bem.
névoa
1
@MihailStoynov Na verdade, isso é essencialmente o que ArrayListfaz - exceto que em vez de redimensionar a cada adição, quando fica sem espaço, ele dobra de tamanho para que não precise redimensionar com tanta freqüência.
corsiKa
1
@Mav Não, porque orgé um mais curto que result.
Paŭlo Ebermann de
19

O Apache Commons tem uma implementação ArrayUtils para adicionar um elemento no final da nova matriz:

/** Copies the given array and adds the given element at the end of the new array. */
public static <T> T[] add(T[] array, T element)
névoa
fonte
2
No ArrayUtils mais recente é: ArrayUtils.appendElement (String.class, origArray, "novo elemento")
marmor
12

Tenho visto essa pergunta muitas vezes na web e, em minha opinião, muitas pessoas com grande reputação não responderam a essas perguntas corretamente. Portanto, gostaria de expressar minha própria resposta aqui.

Primeiro, devemos considerar que há uma diferença entre arraye arraylist.

A questão pede para adicionar um elemento a uma matriz , e não ArrayList


A resposta é bem simples. Isso pode ser feito em 3 etapas.

  1. Converter array em arraylist
  2. Adicionar elemento a arrayList
  3. Converta de volta a nova arrayList para a matriz

Aqui está uma imagem simples disso insira a descrição da imagem aqui

E finalmente aqui está o código:

Passo 1:

public List<String> convertArrayToList(String[] array){
        List<String> stringList = new ArrayList<String>(Arrays.asList(array));
        return stringList;
    }

Passo 2:

public  List<String> addToList(String element,List<String> list){

            list.add(element);
            return list;
    }

Etapa 3:

public String[] convertListToArray(List<String> list){
           String[] ins = (String[])list.toArray(new String[list.size()]);
           return ins;
    } 

Passo 4

public String[] addNewItemToArray(String element,String [] array){
        List<String> list = convertArrayToList(array);
        list= addToList(element,list);
        return  convertListToArray(list);
}
Jimmy
fonte
1
Votado porque finalmente alguém chamou a atenção para a diferença entre uma matriz real e ArrayList ...
JoeG
Resposta mais completa e descritiva.
Obaid
11

Você pode usar um ArrayListe, em seguida, usar o toArray()método. Mas dependendo do que você está fazendo, pode nem mesmo precisar de um array. Procure ver se Listsé mais o que você deseja.

Veja: Tutorial da Lista Java

Ian Dallas
fonte
5

Você provavelmente deseja usar um ArrayList para isso - para uma estrutura semelhante a um array de tamanho dinâmico.

Hovercraft cheio de enguias
fonte
4

Você pode adicionar elementos dinamicamente a uma matriz usando Collection Frameworks em JAVA. O framework de coleção não funciona em tipos de dados primitivos.

Esta estrutura de coleção estará disponível no pacote "java.util. *"

Por exemplo, se você usar ArrayList,

Crie um objeto para ele e, em seguida, adicione o número de elementos (qualquer tipo como String, Integer ... etc)

ArrayList a = new ArrayList();
a.add("suman");
a.add(new Integer(3));
a.add("gurram");

Agora você adicionou 3 elementos a um array.

se você deseja remover qualquer um dos elementos adicionados

a.remove("suman");

novamente se você quiser adicionar qualquer elemento

a.add("Gurram");

Portanto, o tamanho da matriz está aumentando / diminuindo dinamicamente ..

SSSM
fonte
1

Use um ArrayList ou juggle para arrays para incrementar automaticamente o tamanho do array.

Ibrahim AshShohail
fonte
0

mantenha uma contagem de onde você está na matriz primitiva

class recordStuff extends Thread
{
    double[] aListOfDoubles;
    int i = 0;

    void run()
    {
        double newData;
        newData = getNewData(); // gets data from somewhere

        aListofDoubles[i] = newData; // adds it to the primitive array of doubles
        i++ // increments the counter for the next pass

        System.out.println("mode: " + doStuff());
    }

    void doStuff()
    {
        // Calculate the mode of the double[] array

        for (int i = 0; i < aListOfDoubles.length; i++) 
        {
            int count = 0;
            for (int j = 0; j < aListOfDoubles.length; j++)
            {
                if (a[j] == a[i]) count++;
            }
            if (count > maxCount) 
            {
                maxCount = count;
                maxValue = aListOfDoubles[i];
            }
        }
        return maxValue;
    }
}

fonte
Isso realmente não tem nada a ver com a questão original de se é ou não possível anexar dinamicamente novos itens a um array primitivo Java.
Joe Day
0

Esta é uma maneira simples de adicionar a um array em java. Usei uma segunda matriz para armazenar minha matriz original e, em seguida, adicionei mais um elemento a ela. Depois disso, passei aquele array de volta ao original.

    int [] test = {12,22,33};
    int [] test2= new int[test.length+1];
    int m=5;int mz=0;
    for ( int test3: test)        
    {          
    test2[mz]=test3; mz++;        
    } 
    test2[mz++]=m;
    test=test2;

    for ( int test3: test)

    {
      System.out.println(test3);
    }
Nenad Bojović
fonte
0

Em Java, o tamanho do array é fixo, mas você pode adicionar elementos dinamicamente a um array de tamanho fixo usando seu índice e loop for. Por favor, encontre o exemplo abaixo.

package simplejava;

import java.util.Arrays;

/**
 *
 * @author sashant
 */
public class SimpleJava {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        try{
            String[] transactions;
            transactions = new String[10];

            for(int i = 0; i < transactions.length; i++){
                transactions[i] = "transaction - "+Integer.toString(i);            
            }

            System.out.println(Arrays.toString(transactions));

        }catch(Exception exc){
            System.out.println(exc.getMessage());
            System.out.println(Arrays.toString(exc.getStackTrace()));
        }
    }

}
Sashant Pardeshi
fonte