еквівалентно push () або pop () для масивів?


78

Я намагаюся додавати, видаляти та посилатись на елементи з масиву, який я створюю у своєму головному файлі Java, але у мене виникають проблеми з з’ясуванням правильного синтаксису. У Actioncript вони мають push () та pop () для додавання та видалення елементів у масиві, чи є еквівалент в android?


1
Який у вас масив? Чи можете ви показати нам якийсь код?
EboMike

int [] intArray = new int {2, 3, 5, 8, 13}; як би я посилався на intArray [3] або на всі елементи по одному?
clayton33

Відповіді:


38

У Java масив має фіксований розмір (після ініціалізації), що означає, що ви не можете додавати або видаляти елементи з масиву.

int[] i = new int[10];

Вищезазначений фрагмент означає, що масив цілих чисел має довжину 10. Неможливо додати одинадцяте ціле число без повторного призначення посилання на новий масив, як показано нижче:

int[] i = new int[11];

У Java пакет java.util містить всі види структур даних, які можуть обробляти додавання та видалення елементів із схожих на масив колекцій. Класична структура даних Stack має методи push і pop.


9
Хороше пояснення, однак майте на увазі, що Stack не такий чудовий клас, як він успадковується від Vector, і як такий повністю синхронізований. Отже, якщо вам не потрібна синхронізація, ArrayList або LinkedList, швидше за все, кращий варіант.
M. Jessup


21

Для тих, хто не має часу на рефакторинг коду для заміни масивів на Collections (наприклад ArrayList), існує альтернатива. На відміну від Collections, довжину масиву не можна змінити, але масив можна замінити, наприклад:

array = push(array, item);

Недоліки в тому

  • весь масив повинен бути скопійований кожного разу, коли ви натискаєте, і
  • вихідний масив Objectне змінюється, тому вам доведеться оновити змінну (и) відповідно.

Ось pushметод для String:
(Ви можете створити кілька pushметодів, один для String, один для intтощо)

private static String[] push(String[] array, String push) {
    String[] longer = new String[array.length + 1];
    for (int i = 0; i < array.length; i++)
        longer[i] = array[i];
    longer[array.length] = push;
    return longer;
}

Ця альтернатива є більш ефективною, коротшою та важчою для читання:

private static String[] push(String[] array, String push) {
    String[] longer = new String[array.length + 1];
    System.arraycopy(array, 0, longer, 0, array.length);
    longer[array.length] = push;
    return longer;
}

10
Я настійно не рекомендую використовувати цей метод. Для дійсно простих і малих масивів це не створить проблем, але для середнього або важкого масиву це призведе до того, що система буде перебирати масив кожного разу, коли додаватиметься елемент. Якщо у вас масив понад 100 елементів і ви хочете додати ще 3 елементи, він зробить 303 операції.
Пантро

6

Ви можете використовувати LinkedList. У ньому є методи зазирнути, опитати і пропонувати.


6

Ви можете використовувати Arrays.copyOf()з невеликим роздумом, щоб зробити гарну допоміжну функцію.

public class ArrayHelper {
    public static <T> T[] push(T[] arr, T item) {
        T[] tmp = Arrays.copyOf(arr, arr.length + 1);
        tmp[tmp.length - 1] = item;
        return tmp;
    }

    public static <T> T[] pop(T[] arr) {
        T[] tmp = Arrays.copyOf(arr, arr.length - 1);
        return tmp;
    }
}

Використання:

String[] items = new String[]{"a", "b", "c"};

items = ArrayHelper.push(items, "d");
items = ArrayHelper.push(items, "e");

items = ArrayHelper.pop(items);

Результати

Оригінал: a, b, c

Масив після push-дзвінків: a, b, c, d, e

Масив після поп-дзвінка: a, b, c, d


Arrays.copyOf()створює новий масив кожного разу, коли його викликають. Якщо вам доведеться запустити досить довгий масив у циклі, продуктивність буде набагато гіршою, ніжfor (...) {String stringC = stringA + stringB}
Фарід
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.