将ArrayList <arraylist <integer >>转换为List <list <integer >>

时间:2018-07-24 21:31:54

标签: java list arraylist

我在工作中遇到了一些编码挑战,我们被要求执行相当多的业务逻辑,这些业务逻辑会产生一个整数列表。我在Integers的ArrayList的ArrayList中具有所需的信息,但始终无法弄清楚如何将其转换为正确的返回类型。

在键入T或Object时也有许多变化。我已经搜索了堆栈溢出,并且有很多类似的问题,但是没有一个给我直接的答案。他们更具概念性。

问题回答: 输出必须是

    List<List<Integer>> (not negotiable). 

给出一个现有的:

    ArrayList<ArrayList<Integer>> **currentArrayList** HOW do you convert that to a List<List<Integer>>. 

我不再需要代码,但是它将使我发疯,能够执行所有逻辑,但不能执行简单的类型转换。

List<List<Integer>> returnList(){
    ArrayList<ArrayList<Integer>> currentArrayList = new ArrayList<ArrayList<Integer>>();
    ArrayList<Integer> innerList = new ArrayList<Integer>();
    innerList.add(new Integer(123));
    currentArrayList.add(innerList);
    List<List<Integer>> newList = ????
    // ??Logic to copy over currentArrayList into newList???
    return newList;
} 

5 个答案:

答案 0 :(得分:1)

只需更改声明类型,因为ArrayList从实现AbstractList的{​​{1}}扩展而来:

List

运行example on GitHub

答案 1 :(得分:1)

您应针对接口进行操作并删除详细的实现细节。在您的示例中,请改用对class cv2_list(list): def __getitem__(self, item): return cv2.imread(super().__getitem__(item)) 的引用,因为您可以向其中添加任何List<List<Integer>实现,包括您的List

ArrayList

如果您需要返回新的public List<List<Integer>> returnList(){ List<List<Integer>> currentList = new ArrayList<>(); List<Integer> innerList = new ArrayList<>(); innerList.add(123); currentList.add(innerList); return currentList; } ,只需将其包装到另一个:

List

或者,使返回的return new ArrayList<>(currentList); 不可修改:

List

修改

如果您确实无法使用return Collections.unmodifiableList(currentList); ,可以使用

将其强制转换为ArrayList
List

此强制类型转换会引发编译器警告,但是您可以使用return (List) currentArrayList; 忽略它,因为您知道返回了正确的类型。

答案 2 :(得分:0)

如果您可以抑制未选中的强制转换警告,则操作非常简单:

@SuppressWarnings("unchecked")
private static List<List<Integer>> convertToInterfaceVersion(ArrayList<ArrayList<Integer>> original) {
  return (List) original;
}

之所以可行是因为List只是ArrayList最终实现的接口。但这也是一个为什么人们通常不将其ArrayLists显式声明为ArrayLists而是声明为Lists的典型例子-首先完全避免了这种情况。 / p>

答案 3 :(得分:0)

经验法则:始终尝试对接口进行编码。

如果您不是代码的开头,即没有机会更改返回类型,则可以使用以下代码,它使用ArrayList的ctor复制通过的List < / p>

List<List<Integer>> returnList() {
   ArrayList<ArrayList<Integer>> currentArrayList = new ArrayList<>();
   ArrayList<Integer> innerList = new ArrayList<>();
   innerList.add(123);
   currentArrayList.add(innerList);
   List<List<Integer>> newList = new ArrayList<>(currentArrayList);
   return newList;
}

否则,如果有机会更改其返回类型,只需将声明类型更改为List<List<Integer>>,它将应用经验法则。

List<List<Integer>> returnList() {
   List<List<Integer>> currentArrayList = new ArrayList<>();
   List<Integer> innerList = new ArrayList<>();
   innerList.add(123);
   currentArrayList.add(innerList);
   return currentArrayList;
}

答案 4 :(得分:0)

就像其他人提到的那样,对接口进行编程。

您的单行解决方案是:

List<List<Integer>> newList = Collections.unmodifiableList(currentArrayList);

但这有明显的缺点:
您不能向其中添加新元素。

考虑一下就很有意义。
您可以将LinkedList<Integer>添加到List<List<Integer>>, 您不能将LinkedList<Integer>添加到List<ArrayList<Integer>>

如果需要修改列表的功能,则可以创建一个新列表:

List<List<Integer>> newList = new ArrayList<>(currentArrayList);

这意味着外部列表已复制。

有最后一个您不应该采用的解决方案,并且使用的是原始类型:

List<List<Integer>> newList = (List) currentArrayList;

虽然可以编译,但是如果有人添加例如LinkedList<Integer>进入该列表,而您仍然希望该列表中的每个元素都是一个ArrayList<Integer>