我需要最简单的方法将一项添加到Java数组的开头。
我需要的是Java数组,而不是ArrayList。
有两种方法可以做到这一点。一种是使用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
方法。
如果你想使用Apache Commons Lang类库的话,'ArrayUtils'类可以非常方便地实现这一点:
char[] arrayA = {'b', 'c'};
char[] arrayB = ArrayUtils.add(arrayA, 0, 'a');
// arrayB: [a, b, c]
for(int i = roadVehicles.length; i > 0; i--) {
if (roadVehicles[i-1] != null) {
roadVehicles[i] = roadVehicles[i-1];
}
}
roadVehicles[0] = car;
Throwable.getStackTrace()
返回一个StackTraceElement
数组。您可能希望捕获该异常,将捕获它的方法的跟踪元素添加到该数组的开头,然后使用setStackTrace(StackTraceElement[])
将其放回异常中。 - PMorganCA为什么不直接使用ArrayList?
您可以使用数组将其转换为列表,如下所示:
List<Integer> myList = Arrays.asList(1,2,3);
//Instead of 1,2,3 you could create an Integer array: Integer[] myArray = {1,2,3};
myList.add(0, 25);
https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
一旦创建数组,就无法调整大小。如果你需要添加元素,你需要创建一个新的数组。
如果你知道数组类型,这很简单,但更好的解决方案可以适用于任何数组类型,使用 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;
}
考虑此来源:
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;
}
这是我能找到的最简单方法的具体示例:
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()
将列表转换回数组。
正如大家所说,除非您首先将所有元素向右移动一个位置,否则无法真正地在数组开头添加元素,或者像我的解决方案一样,创建一个新的数组。
我使用了这个方法:
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。
只需使用.unshift()
这将在数组的开头添加一个元素。
unshift()
是JavaScript数组方法。它在Java中不存在。 - Tyler Tian
Array
的StackArray
。 - ChiefTwoPencils