Java ArrayList的转换<;ArrayList<;整数>&燃气轮机;列出<;列表<;整数>&燃气轮机;
我在工作中做了一个小的编码挑战,我们需要执行相当多的业务逻辑,从而生成一个整数列表。我在ArrayList of ArrayList of Integers中包含了所需的信息,但我始终不知道如何将其转换为正确的返回类型 在键入时使用T或Object也有很多变化。我搜索过堆栈溢出,有许多类似的问题,但没有一个能给我一个直接的答案;它们更具概念性 要回答的问题: 输出必须是一个Java ArrayList的转换<;ArrayList<;整数>&燃气轮机;列出<;列表<;整数>&燃气轮机;,java,list,arraylist,Java,List,Arraylist,我在工作中做了一个小的编码挑战,我们需要执行相当多的业务逻辑,从而生成一个整数列表。我在ArrayList of ArrayList of Integers中包含了所需的信息,但我始终不知道如何将其转换为正确的返回类型 在键入时使用T或Object也有很多变化。我搜索过堆栈溢出,有许多类似的问题,但没有一个能给我一个直接的答案;它们更具概念性 要回答的问题: 输出必须是一个 List<List<Integer>> (not negotiable). 列表(不可
List<List<Integer>> (not negotiable).
列表(不可协商)。
鉴于现有的:
ArrayList<ArrayList<Integer>> **currentArrayList** HOW do you convert that to a List<List<Integer>>.
ArrayList**currentArrayList**如何将其转换为列表。
我不再需要代码了,但它会让我发疯,因为我能够完成所有的逻辑,而不是简单的类型转换
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;
}
List returnList(){
ArrayList currentArrayList=新建ArrayList();
ArrayList innerList=新的ArrayList();
add(新的整数(123));
currentArrayList.add(内部列表);
列表新建列表=????
//?通过currentArrayList复制到newList的逻辑???
返回newList;
}
只需像这样更改声明类型,因为ArrayList
扩展自实现List
的AbstractList
:
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;
}
List returnList(){
List currentArrayList=新建ArrayList();
List innerList=new ArrayList();
add(新的整数(123));
currentArrayList.add(内部列表);
返回当前数组列表;
}
运行如果您对取消未检查的强制转换警告没有异议,那么它很简单:
@SuppressWarnings("unchecked")
private static List<List<Integer>> convertToInterfaceVersion(ArrayList<ArrayList<Integer>> original) {
return (List) original;
}
@SuppressWarnings(“未选中”)
私有静态列表转换为接口版本(ArrayList原件){
返回(列表)原件;
}
这是可能的,因为
List
只是ArrayList
最终实现的一个接口。但这也是一个很好的例子,说明了为什么人们通常不会将他们的ArrayLists
显式声明为ArrayLists
,而是像list
——它从一开始就完全防止了这种情况。您应该针对接口工作,删除extact实现细节。在您的示例中,请参考列表经验法则:始终尝试对接口进行编码
如果您不是代码的开头,也就是说,没有机会更改返回类型,您可以使用以下命令,它使用ArrayList的ctor
复制通过的列表
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 returnList(){
ArrayList currentArrayList=新建ArrayList();
ArrayList innerList=新的ArrayList();
添加(123);
currentArrayList.add(内部列表);
List newList=new ArrayList(当前ArrayList);
返回newList;
}
否则,如果有机会更改其返回类型,只需将声明类型更改为List
,它将应用经验法则
List<List<Integer>> returnList() {
List<List<Integer>> currentArrayList = new ArrayList<>();
List<Integer> innerList = new ArrayList<>();
innerList.add(123);
currentArrayList.add(innerList);
return currentArrayList;
}
List returnList(){
List currentArrayList=新建ArrayList();
List innerList=new ArrayList();
添加(123);
currentArrayList.add(内部列表);
返回当前数组列表;
}
如其他人所述,编程到接口
您的单线解决方案是:
List<List<Integer>> newList = Collections.unmodifiableList(currentArrayList);
List newList=集合。不可修改列表(currentArrayList);
但这有一个明显的缺点:
不能向其中添加新元素
如果你仔细想想,这是有道理的。
虽然您可以将链接列表
添加到列表
,
您不能将链接列表添加到列表
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<List<Integer>> newList = new ArrayList<>(currentArrayList);
List newList=newarraylist(当前ArrayList);
这意味着将复制外部列表
您不应采用最后一种解决方案,它使用的是原始类型:
List<List<Integer>> newList = (List) currentArrayList;
List newList=(List)currentArrayList;
虽然这将进行编译,但如果有人在该列表中添加(例如)一个LinkedList
,而您仍然希望该列表中的每个元素都是ArrayList
list currentArrayList=new ArrayList(),它可能会在以后中断代码>是什么让您认为您应该能够进行此转换?列表
不是列表
@VeeArr并不意味着它不能被转换。@shmosel当然是这样;我只是想指出,没有一种方法必须是类型安全的,类似于将对象
强制转换到特定子类的方式(尽管原因不同)。您不必强制转换。您可以将它们复制到新列表中:list newList=new ArrayList(currentArrayList)代码>从一开始这就是正确的方法,但是如果遗留代码正在处理中,可能很难返回并简单地将其声明为List
s的List
。@Treebasher我想一点编码挑战不是遗留代码,并且这里不会修改方法返回类型,只有实现细节。@lealcelderio如我在回答中所述,您可能应该将ArrayList innerList=new ArrayList()
更改为List innerList=new ArrayList()代码>也是。@Glains当然!这是我从一开始的意图。我完全错过了这一点:)非常感谢你指出这一点!键入:currentArray
应为currentList
。
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>> newList = new ArrayList<>(currentArrayList);
List<List<Integer>> newList = (List) currentArrayList;