Java数组排序(我做错了什么)

标签 java arrays sorting indexoutofboundsexception

编辑 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/

相关文章:

python - 使用列表的 Numpy 3D 数组索引

c - 关于在C编程中只为数组、排序和数字分配内存的问题

java - 在 ColdFusion 中获取货币符号 aka localeconv()?

javascript - 将 HTML 单选按钮的数据存储到 Javascript 数组中

php - 旋转一个以工作日名称为键的数组以从明天开始

mysql - 根据相同的列集对数据进行排序

SQLite - 排序

java - 输入不匹配异常错误,

java - 如何使用 jasper 报告在 java beans 中生成包含 3 个嵌套列表的表?

java - Apache DefaultHttpClient (Android) 和 NSURLConnection (iOS) 是否会重试与旧协议(protocol)版本的失败连接?