【问题标题】:List operations for plain arrays普通数组的列表操作
【发布时间】:2012-11-21 02:12:03
【问题描述】:

我一直在寻找一种方法来“自动化”所有需要的转换,以使 List 操作可用于普通数组。问题是

public static Object[] arrayRemoveAll(Object[] oA, Object[] removeA) {
    List<Object> l = new ArrayList<Object>(Arrays.asList(oA));
    l.removeAll(Arrays.asList(removeA));
    return l.toArray(new Object[l.size()]);
}

当我尝试将对象转换回其原始数组类型时,总是给我 ClassCastException(例如,如果我调用 (String[])arrayRemoveAll(strA, strA2))。

我明白为什么会发生这种情况,但是有什么巧妙的方法可以规避这种情况吗?我希望能够为一些标准的 List 操作使用通用函数。

非常感谢。

【问题讨论】:

  • 避免这种情况的巧妙方法是首先使用列表而不是数组。

标签: java arrays


【解决方案1】:

怎么样

public static <T> T[] arrayRemoveAll(T[] oA, Object[] removeA) {
    List<T> l = new ArrayList<T>(Arrays.asList(oA));
    l.removeAll(Arrays.asList(removeA));
    return l.toArray(Arrays.copyOf(oA, l.size()));
}

不过,就我个人而言,我会避免列出所有转换并手动编写循环的成本开销。它并没有变得那么冗长。

另外,如果您已经在使用 Commons Lang,它有 ArrayUtils#removeElements

【讨论】:

  • 请注意,编译时没有警告
  • 非常感谢,这有帮助! :)
【解决方案2】:

你可以使用泛型。例如:

@SuppressWarnings("unchecked")
public static <T> T[] arrayRemoveAll(T[] oA, T[] removeA) {
    java.util.List<T> l = new ArrayList<T>(Arrays.asList(oA));
    l.removeAll(Arrays.asList(removeA));
    Class<T> clazz = (Class<T>)removeA.getClass().getComponentType();
    return l.toArray((T[]) Array.newInstance(clazz, l.size()));
}

【讨论】:

  • 刚刚测试了上面的代码,编译运行良好。我想它唯一的负面影响是未经检查的演员表......
  • 它也可以为我编译...没有去测试它。
  • 哦,我试图提供另一种方法来解决您原来的问题:P
  • 你甚至不需要 newInstance(..) 的第二个参数是 l.size()。它可能是 0。但如果你使用正确大小的新数组,人们说它会执行得更快 (stackoverflow.com/questions/727627/…)。
【解决方案3】:

您不能将Object[] 转换为另一种数组类型,因为如您所知,数组不会扩展Object[]。但是,您可以遍历数组并将每个元素转换回原始类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多