等同于push()或pop()的数组?


77

我试图从我在主java文件中创建的数组中添加,删除和引用项目,但是我在弄清楚正确的语法时遇到了麻烦。在动作脚本中,它们具有push()和pop()来添加和删除数组中的项,android中是否有等效项?


1
您拥有哪种阵列?你能给我们看一些代码吗?
EboMike 2010年

int [] intArray = new int {2,3,5,8,13}; 我将如何一次引用intArray [3]或所有项目?
clayton33 2010年

Answers:


38

在Java中,数组的大小是固定的(初始化后),这意味着您无法在数组中添加或删除项目。

int[] i = new int[10];

上面的代码段表示整数数组的长度为10。如果不将引用重新分配给新数组,则不可能添加第11个整数,如下所示:

int[] i = new int[11];

在Java中,包java.util包含各种数据结构,这些数据结构可以处理在类似数组的集合中添加和删除项的操作。经典的数据结构Stack具有用于推入和弹出的方法。


9
有一个很好的解释,但是请记住,Stack不是一个很好的类,因为它继承自Vector,因此是完全同步的。因此,除非需要同步,否则ArrayList或LinkedList可能是一个更好的选择。
M. Jessup 2010年


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个操作。
Panthro

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

推送调用后的数组: a,b,c,d,e

弹出呼叫后的数组: a,b,c,d


Arrays.copyOf()每次调用时都会创建一个新数组。如果您必须在循环中弹出相当长的数组,性能将比for (...) {String stringC = stringA + stringB}
Farid
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.