Как я могу динамически добавлять элементы в массив Java?

85

В PHP вы можете динамически добавлять элементы в массивы следующими способами:

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

После этого $xбудет массив как это: {1,2}.

Есть ли способ сделать что-то подобное на Java?

kamikaze_pilot
источник
4
Для всех ответов ниже используется ArrayList, но OP специально запрашивает массив. я тоже хотел бы знать.
KJYe.Name 葉家仁
4
ответ - «Нет». Вы должны указать размер массива (или заполнить все элементы) во время объявления / создания в Java. Пожалуйста , см java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
Ritesh
Я заметил, что различные Java-функции возвращают массивы, поэтому посмотрел на реализацию списка (фильтра) в File.java. Он использует список внутри, а затем преобразует его в массив в конце. Список <String> v = новый ArrayList <> (); ... return v.toArray (new String [v.size ()]);
xtempore

Ответы:

112

Посмотрите java.util.LinkedList или java.util.ArrayList

List<Integer> x = new ArrayList<Integer>();
x.add(1);
x.add(2);
corsiKa
источник
21
Это идеальный ответ, за исключением одного предмета. Обычно в Java мы просто используем List вместо примитивных массивов, но для случаев, когда вам действительно нужен примитивный массив (например, int[]), просто используйте toArray()метод в List. Используйте приведенный выше код, но используйте, x.toArray()чтобы получить примитивный массив.
rharter 01
1
В 99% случаев (больше похоже на 99,99999% случаев), если вам действительно нужен примитивный массив, вы делаете что-то не так, и с ним следует обращаться с принципами объектно-ориентированного программирования. Если вы не взаимодействуете с машинным кодом или чем-то вроде ARRAYобъектов Oracle, или какой-нибудь глупости в этом роде , вам гораздо лучше избегать примитивных массивов.
corsiKa 01
11
ох, все эти комментарии о том, как нельзя использовать примитивные массивы, если бы только это было так просто :(
thecoshman
1
@trusktr Это одна из причин сделать это. В этом примере это больше похоже на ... использование Listссылки позволяет нам приступить ArrayListк работе в любое время, когда мы захотим. Если кто-то выпустит лучший список, например SuperDuperAwesomeList, у нас может быть много работы, если мы сделаем ссылку на ArrayList. В ArrayList есть вещи, которых нет в List. Если мы полагаемся на эти вещи в нашем коде, становится намного сложнее поменять местами.
corsiKa 03
1
@corsiKa, напишите несколько алгоритмов сжатия / кодирования без примитивов, и эти случаи встречаются намного чаще, чем 99. (9). Матрикс также подразумевает примитивы крика. На заметку, если вы взаимодействуете с машинным кодом, вы используете DirectBuffers, а не примитивные массивы. В конце концов, у кого-то есть металл, если вы застряли с базами данных и презентациями, это нормально, но утверждение 99% просто глупо.
bestsss
64

Массивы в Java имеют фиксированный размер, поэтому вы не можете «добавить что-нибудь в конце», как в PHP.

Немного похоже на поведение PHP:

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

Тогда вы можете написать:

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

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

Но эта схема ужасно неэффективна для больших массивов , поскольку она каждый раз копирует весь массив. (И на самом деле это не полностью эквивалентно PHP, поскольку ваши старые массивы остаются такими же).

Массивы PHP фактически такие же, как Java HashMap с добавленным «максимальным ключом», поэтому он будет знать, какой ключ использовать следующим, и странный порядок итераций (и странное отношение эквивалентности между целочисленными ключами и некоторыми строками). Но для простых проиндексированных коллекций лучше использовать список в Java, как предлагали другие респонденты.

Если вы хотите избежать использования Listиз-за накладных расходов, связанных с переносом каждого int в Integer, рассмотрите возможность использования повторных реализаций коллекций для примитивных типов, которые используют массивы внутри, но не будут делать копию при каждом изменении, только когда внутренний массив заполнен ( точно так же, как ArrayList). (Одним из примеров быстрого поиска в Google является этот класс IntList .)

Гуава содержит методы создания таких оболочек в Ints.asList, Longs.asListи т.д.

Пало Эберманн
источник
это намного умнее принятого решения. нет потерянных предметов.
Mist
2
@Mihail: На самом деле, я обычно не рекомендую этого делать, поскольку при каждом добавлении элемента создается новый массив и копируется все содержимое. (Это зависит от вашего
варианта
ArrayUtils в более новых версиях имеет метод, который это делает. Мне лень проверять реализацию, но я почти уверен, что они хорошо написали.
туман
1
@MihailStoynov На самом деле, именно это и есть ArrayList, за исключением того, что вместо изменения размера при каждом добавлении, когда ему не хватает места, он удваивается в размере, поэтому его не нужно изменять так часто.
corsiKa
1
@Mav Нет, потому что orgон на единицу короче result.
Паоло Эберманн
19

В Apache Commons есть реализация ArrayUtils для добавления элемента в конец нового массива:

/** 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)
туман
источник
2
В более новом ArrayUtils это: ArrayUtils.appendElement (String.class, origArray, «новый элемент»)
marmor
12

Я очень часто встречал этот вопрос в сети и, на мой взгляд, многие люди с хорошей репутацией не ответили на эти вопросы должным образом. Поэтому я хотел бы высказать здесь свой собственный ответ.

Во-первых, мы должны учесть разницу между arrayи arraylist.

Вопрос просит добавить элемент в массив , а не ArrayList


Ответ довольно прост. Это можно сделать за 3 шага.

  1. Преобразовать массив в arrayylist
  2. Добавить элемент в arrayList
  3. Преобразуйте обратно новый arrayList в массив

Вот простая картина этого введите описание изображения здесь

И, наконец, вот код:

Шаг 1:

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

Шаг 2:

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

            list.add(element);
            return list;
    }

Шаг 3:

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

Шаг 4

public String[] addNewItemToArray(String element,String [] array){
        List<String> list = convertArrayToList(array);
        list= addToList(element,list);
        return  convertListToArray(list);
}
Джимми
источник
1
Проголосовали, потому что, наконец, кто-то назвал разницу между реальным массивом и ArrayList ...
JoeG 07
Наиболее полный и информативный ответ.
Обэйд
11

Вы можете использовать, ArrayListа затем использовать toArray()метод. Но в зависимости от того, что вы делаете, вам может вообще не понадобиться массив. Посмотрите, Listsхотите ли вы большего.

См .: Руководство по спискам Java.

Ян Даллас
источник
5

Вероятно, вы захотите использовать для этого ArrayList - для массива динамического размера, такого как структура.

Судно на воздушной подушке, полное угрей
источник
4

Вы можете динамически добавлять элементы в массив с помощью Collection Frameworks в JAVA. collection Framework не работает с примитивными типами данных.

Эта структура коллекции будет доступна в пакете java.util. *

Например, если вы используете ArrayList,

Создайте для него объект, а затем добавьте количество элементов (любого типа, например String, Integer ... и т. Д.)

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

Теперь вы добавили 3 элемента в массив.

если вы хотите удалить любой из добавленных элементов

a.remove("suman");

снова, если вы хотите добавить какой-либо элемент

a.add("Gurram");

Таким образом, размер массива динамически увеличивается / уменьшается.

СССМ
источник
1

Используйте ArrayList или жонглируйте массивами, чтобы автоматически увеличивать размер массива.

Ибрагим АшШохаил
источник
0

вести счет того, где вы находитесь в примитивном массиве

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;
    }
}

источник
На самом деле это не имеет ничего общего с исходным вопросом о том, возможно ли динамически добавлять новые элементы в примитивный массив Java.
Joe Day
0

Это простой способ добавить в массив в java. Я использовал второй массив для хранения исходного массива, а затем добавил к нему еще один элемент. После этого я передал этот массив обратно в исходный.

    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);
    }
Ненад Бойович
источник
0

В Java размер массива фиксирован, но вы можете динамически добавлять элементы в массив фиксированного размера, используя его индекс и цикл for. Пожалуйста, найдите пример ниже.

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()));
        }
    }

}
Сашант Пардеши
источник