Як я можу динамічно додавати елементи до масиву Java?


85

У PHP ви можете динамічно додавати елементи до масивів наступним чином:

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

Після цього $xбуде масив як це: {1,2}.

Чи є спосіб зробити щось подібне в Java?


4
Для всіх наведених нижче відповідей використовується ArrayList, але OP спеціально запитує Array. я теж хотів би це знати.
KJYe.Name 葉家仁

4
відповідь - «Ні». Вам потрібно вказати розмір масиву (або заповнити всі елементи) під час оголошення / створення в Java. Будь ласка , см java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
Ritesh

Я помітив, що різні функції Java повертають масиви, тому подивився реалізацію списку (фільтра) у File.java. Він використовує List внутрішньо, а потім перетворює його в масив в кінці. List <String> v = new ArrayList <> (); ... повернення v.toArray (новий рядок [v.size ()]);
xtempore

Відповіді:


112

Подивіться на java.util.LinkedList або java.util.ArrayList

List<Integer> x = new ArrayList<Integer>();
x.add(1);
x.add(2);

21
Це ідеальна відповідь, за винятком однієї частини. Зазвичай в Java ми просто використовуємо List замість примітивних масивів, але для випадків, коли вам насправді потрібен примітивний масив (наприклад int[]), просто використовуйте toArray()метод у List. Використовуйте код вище, але використовуйте, x.toArray()щоб отримати примітивний масив.
rharter

1
У 99% випадків (більше, як 99,99999% випадків), якщо вам насправді потрібен примітивний масив, ви робите щось неправильно, і це повинно оброблятися за принципами ОО. Якщо ви не взаємодієте з власним кодом або чимось на зразок ARRAYоб’єктів Oracle або подібними дурнями, вам набагато краще уникати примітивних масивів.
corsiKa

11
о, всі ці коментарі про те, як не слід використовувати примітивні масиви, якби це було так просто :(
thecoshman

1
@trusktr Це одна з причин для цього. У цьому прикладі справа дорівнює ... за допомогою Listпосилання дозволяє нам рухатися ArrayListдо бордюру в будь-який час, коли нам заманеться. Якщо хтось випустить кращий список, наприклад SuperDuperAwesomeList, нам, можливо, доведеться зробити багато роботи, якщо ми зробимо посилання на нас ArrayList. ArrayList містить речі, яких у Списку немає. Якщо ми покладаємось на ці речі у нашому коді, замінити їх стає набагато складніше.
corsiKa

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 з доданим "макс. Ключем", тому він буде знати, який ключ використовувати далі, і дивний порядок ітерацій (і дивне відношення еквівалентності між цілими клавішами та деякими рядками). Але для простих індексованих колекцій краще використовувати List в Java, як інші запропоновані відповіді.

Якщо ви хочете уникнути використання Listчерез накладні витрати на обертання кожного int у ціле число, розгляньте можливість використання повторної реалізації колекцій для примітивних типів, які використовують масиви всередині, але не роблять копію при кожній зміні, лише коли внутрішній масив заповнений ( так само, як ArrayList). (Одним із швидких пошукових прикладів є клас IntList .)

Гуава містить методи створення таких оболонок в Ints.asList, Longs.asListі т.д.


це набагато розумніше прийнятого рішення. відсутність витрачених предметів.
туман

2
@Mihail: Насправді я зазвичай не рекомендую робити це, оскільки для кожного додавання елемента створюється новий масив і копіюється весь вміст. (Однак це залежить від вашого випадку використання - якщо ви рідко що-небудь додаєте / видаляєте що-небудь і часто повторюєте / шукаєте, це може бути нормально.)
Paŭlo Ebermann

ArrayUtils у новіших версіях має метод, який це робить. Мені лінь перевірити реалізацію, але я впевнений, що вони це добре написали.
туман

1
@MihailStoynov Насправді, це, по суті, саме те, що ArrayListробить - за винятком того, що замість того, щоб змінювати розмір кожного додавання, коли він закінчується, він подвоюється в розмірі, тому йому не доведеться змінювати розмір майже так часто.
corsiKa

1
@Mav Ні, оскільки orgна один коротший за result.
Paŭlo Ebermann

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. Перетворити масив на список записів
  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

Найповніша та описова відповідь.
Obaid

11

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

Див .: Підручник зі списку Java



4

Ви можете динамічно додавати елементи до масиву, використовуючи Framework Collection у JAVA. framework 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");

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



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.
Джо Дей

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

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.