编辑 3:这是问题的原因:
对于removeArrayElement(第一个版本),它返回的是toArray(new Item[0]),它在最后执行了null元素,但是使用new方法,它返回的是toArray(arr),它不执行null,但是你不能创建 T 的通用类型数组,即 new T[0],那么什么是替代品?而不是“再次传递数组”以在末尾摆脱空元素
老问题:
我最近通过创建一个主方法(通过实现泛型类型)更新了我处理数组排序的方式,只有后果方法给我数组越界错误。
有什么我遗漏的吗?
旧方法:
private static Item[] insertTabItem(Item[] a, int pos, Item item) {
Item[] result = new Item[a.length + 1];
for(int i = 0; i < pos; i++)
result[i] = a[i];
result[pos] = item;
for(int i = pos + 1; i < a.length + 1; i++)
result[i] = a[i - 1];
return result;
}
private static Item[] removeArrayItem(Item[] arr, Item item) {
List<Item> list = new ArrayList<Item>(Arrays.asList(arr));
for (int i = 0; i < list.size(); i++) {
if (list.get(i) == item) {
list.remove(i);
}
}
return list.toArray(new Item[0]);
}
新方法(给出 java.lang.ArrayIndexOutOfBoundsException)
public static <T> T[] insertArrayElement(T[] arr, int pos, T item) {
final int N = arr.length;
T[] result = Arrays.copyOf(arr, N + 1);
for(int i = 0; i < pos; i++)
result[i] = arr[i];
result[pos] = item;
for(int i = pos + 1; i < N + 1; i++)
result[i] = arr[i - 1];
return result;
}
public static <T> T[] removeArrayElement(T[] arr, T item) {
List<T> list = new ArrayList<T>(Arrays.asList(arr));
for (int i = 0; i < list.size(); i++) {
if (list.get(i) == item) {
list.remove(i);
}
}
return list.toArray(arr);
}
编辑:
阅读一些答案后,我将 removeArrayElement 更改为:
public static <T> T[] removeArrayElement(T[] arr, T item) {
for (Iterator<T> iterator = list.iterator(); iterator.hasNext();) {
T t = iterator.next();
if (t == item) {
iterator.remove();
}
}
return list.toArray(arr);
}
但它仍然出于某种原因发送:java.lang.ArrayIndexOutOfBoundsException
EDIT2:完整的可执行文件
bankContents[bankSlots[0]] = Utils.removeArrayElement(bankContents[bankSlots[0]], newbankVarient);
当 newBankVarient 为 = bankContents[bankSlots[0]][1] 并删除它时,系统超出数组 AFTER 为:
"[var, var, var, null]
最佳答案
如果不运行您的代码,可能是 removeArrayElement
导致了异常。
在迭代相同循环的 for
循环中使用 list.remove(i)
是不好的做法。
要么,您需要在 remove(i)
调用之后直接break;
,或者您可以考虑使用迭代器,它“在迭代时可以安全删除” ".
例如:Java, Using Iterator to search an ArrayList and delete matching objects
最后,如果 T
是可比较的,那么您应该能够通过 list.remove(item)
从列表中删除 - 您不需要乱用索引如果你不需要。
关于Java数组排序(我做错了什么),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42275145/