在Java中将一个项添加到数组开头的最简单方法

10

我需要最简单的方法将一项添加到Java数组的开头。
我需要的是Java数组,而不是ArrayList。


3
请创建一个新的数组,长度比原来的数组多1,将新项目放在第一个索引位置,然后用旧数组填充其余位置。 - localplutonium
创建一个包装 ArrayStackArray - ChiefTwoPencils
10个回答

8

有两种方法可以做到这一点。一种是使用Objects,另一种是使用generics。我建议您使用generics,因为它会在下面的示例中给您更多的灵活性。

在这个第一个实现中,函数add2BeginningOfArray使用了generics

public static <T> T[] add2BeginningOfArray(T[] elements, T element)
{
    T[] newArray = Arrays.copyOf(elements, elements.length + 1);
    newArray[0] = element;
    System.arraycopy(elements, 0, newArray, 1, elements.length);

    return newArray;
}

调用这个函数非常简单。例如,如果你有一个名为Dot的类,并且想要将一个元素添加到一个Dot对象数组的开头,你只需要这样做:

int size = 20;
Dot[] dots = new Dot[size];
for (int i = 0; i < size; i++) {
    dots[i] = new Dot("This is a dot");
}

Dot goal = new Dot("This is a goal");

System.out.println(Arrays.toString(add2BeginningOfArray(dots, goal)));

您可以通过如下示例将函数参数声明为Object并实现该功能:
public static Object[] add2BeginningOfArray(Object[] elements, Object element){
    Object[] tempArr = new Object[elements.length + 1];
    tempArr[0] = element;
    System.arraycopy(elements, 0, tempArr, 1, elements.length);
}

现在,问题是什么?其实并不是什么大问题,只需要将你的数组声明为Object[]并使用这种声明来操作它即可。
Object[] foo = {"2", "3", "4"};

//adding an element to the beginning array
Object[] numbers = add2BeginningOfArray(foo, "1");
System.out.println(Arrays.toString(numbers));

对我来说,泛型方法更加清晰、可扩展性更强,因此我非常建议使用它而不是Object方法。


7

如果你想使用Apache Commons Lang类库的话,'ArrayUtils'类可以非常方便地实现这一点:

char[] arrayA = {'b', 'c'};
char[] arrayB = ArrayUtils.add(arrayA, 0, 'a');
// arrayB: [a, b, c]

3
for(int i = roadVehicles.length; i > 0; i--) {
    if (roadVehicles[i-1] != null) {
        roadVehicles[i] = roadVehicles[i-1];                
    }
}
roadVehicles[0] = car;

3
请解释一下你的代码实际在做什么(我认为这并没有正确回答不明确的问题,或者至少有两个解决方案) - try-catch-finally

2
根据Java教程(我强烈推荐初学者通过该教程进行学习),一个数组是一个容器对象,它可以容纳固定数量的单一类型值。数组的长度在创建数组时确定,并且创建后其长度就固定了。因为数组不能被调整大小,你可以覆盖第一个元素,但要执行插入操作,必须创建一个比之前大1的新数组,将新元素放在第一个位置并用现有元素填充数组的其余部分。
当然,在实践中不要这样做。相反,使用适合您实际用例的集合。
因此,回答您的问题的实际方法是:将项添加到Java数组的最前面的最简单方法是使用更好的集合类型,例如Deque
我无法想到在Java中使用原始数组而不是更合适的集合类型的任何有效理由,如果需要在前面插入元素。

很不幸,这是必须的。当我在前面插入项目时,基本上需要将项目“向下”移动。 - Eminem
2
如果这是一个要求,那就找另一家雇主吧!编程本来就很难,不必再遇到荒谬的任意限制。如果这是为了任务或教育目的,那么创建一个比原数组大1的新数组是最简单的解决方案,但肯定不是最有效的。 - Matt Coubrough
@Eminem,听起来你刚刚回答了自己的问题。 - ChiefTwoPencils
@MattCoubrough这是一个有效的理由:Throwable.getStackTrace()返回一个StackTraceElement数组。您可能希望捕获该异常,将捕获它的方法的跟踪元素添加到该数组的开头,然后使用setStackTrace(StackTraceElement[])将其放回异常中。 - PMorganCA

2

因为被要求不使用ArrayList。 - Eminem
我认为你可以通过创建一个大小为oldArray+elementsToInsert的新数组来实现,这样你就可以在前面添加新元素,在后面添加其他元素。 - Carlos Parra
你试过你的代码了吗?Arrays::asList方法使用的ArrayList没有覆盖AbstractList::add(int, T)的默认实现,因此会自动抛出UnimplementedException异常。 - Vincent Engel
Arrays.asList 生成一个不可变的列表,这意味着你无法在开头添加元素。这段代码是无效的。 - Sam

2

一旦创建数组,就无法调整大小。如果你需要添加元素,你需要创建一个新的数组。 如果你知道数组类型,这很简单,但更好的解决方案可以适用于任何数组类型,使用 java.lang.reflect.Array

示例代码:

public static Object addElementInFrontOfArray(Object array, Object element) {
     int newArraySize = Array.getLength(array)+1;
     Object newArray = Array.newInstance(element.getClass(), newArraySize);
     //Add first element
     Array.set(newArray, 0, element);
     for (int i=1 ; i<newArraySize; i++) {
         Array.set(newArray, i, Array.get(array, i-1));
     }
     return newArray;
}

考虑到您可以将 int[] 数组作为参数传递,但是将返回 Integer[] 数组。

2

考虑此来源:

https://www.journaldev.com/763/java-array-add-elements

你可以通过以下方式在数组的开头添加新元素:

    public static Object[] add(Object[] arr, Object... elements){
    Object[] tempArr = new Object[arr.length+elements.length];
    System.arraycopy(arr, 0, tempArr, elements.length, arr.length);

    for(int i=0; i < elements.length; i++)
        tempArr[i] = elements[i];
    return tempArr;

}

0

这是我能找到的最简单方法的具体示例:

    List<StackTraceElement> stack = new ArrayList<StackTraceElement> (Arrays.asList (e.getStackTrace()));
    stack.add (0, new StackTraceElement ("class", "method", "file", 25439));
    StackTraceElement[] newStack = new StackTraceElement[stack.size()];
    newStack = stack.toArray (newStack);  
    e.setStackTrace (newStack);

基本上它使用 java.util.Arrays.asList() 将数组转换为 List,向列表添加元素,然后使用 List.toArray() 将列表转换回数组。

正如大家所说,除非您首先将所有元素向右移动一个位置,否则无法真正地在数组开头添加元素,或者像我的解决方案一样,创建一个新的数组。


0

我使用了这个方法:

public void addFront(Item item) { //add item to the front
    Item temp = arr[0];
    arr[0] = item;
    for (int i = 1; i < arr.length - 1; i++) {
        Item temp2 = arr[i];
        arr[i] = temp;
        temp = temp2;
    }
}

但是你应该管理调整大小或ArrayIndexOutOfBoundsException,以防你添加的元素比数组最初预定义的长度更多。这是来自Robert Sedgewick和Kevin Wayne的《算法》第四版的练习3.5.27。


-1

只需使用.unshift()

这将在数组的开头添加一个元素。


2
unshift()JavaScript数组方法。它在Java中不存在。 - Tyler Tian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接