为了账号安全,请及时绑定邮箱和手机立即绑定

将 ArrayList<ArrayList<Integer>> 转换为 List<List

将 ArrayList<ArrayList<Integer>> 转换为 List<List

aluckdog 2021-06-07 17:41:45
我在工作中做了一些编码挑战,我们需要执行相当多的业务逻辑,从而生成一个整数列表列表。我在 ArrayList of Integers 的 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;} 
查看完整描述

3 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

您应该针对接口工作并删除具体的实现细节。在您的示例中,请改用对的引用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;

}

如果您需要返回一个 new List,只需将其包装成另一个:


return new ArrayList<>(currentList);

或者,使返回的List不可修改:


return Collections.unmodifiableList(currentList);

编辑


如果你真的坚持使用,ArrayList你可以将它转换为Listwith


return (List) currentArrayList;

此强制转换会引发编译器警告,但您可以忽略它,@SuppressWarnings("unchecked")因为您知道返回了正确的类型。


查看完整回答
反对 回复 2021-06-10
?
jeck猫

TA贡献1909条经验 获得超7个赞

只需像这样更改声明类型,因为ArrayListextends from AbstractListwhich implements List:


List<List<Integer>> returnList(){

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

    List<Integer> innerList = new ArrayList<>();

    innerList.add(new Integer(123));

    currentArrayList.add(innerList);

    return currentArrayList;

}


查看完整回答
反对 回复 2021-06-10
?
白板的微信

TA贡献1883条经验 获得超3个赞

正如其他人提到的,编程到接口。

您的单线解决方案是:

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;

虽然这会编译,但如果有人将例如 a 添加LinkedList<Integer>到该列表中,它可能会在稍后中断,而您仍然希望该列表中的每个元素都是一个ArrayList<Integer>


查看完整回答
反对 回复 2021-06-10
  • 3 回答
  • 0 关注
  • 398 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信