2015-10-22 104 views
3

我是新来编码。我的老师最近介绍了阵列和阵列列表。我有一个多维阵列是这样的:使用值初始化多维ArrayList

private String[][] pods = {{"pod1", ""}, {"pod2", ""}, {"pod3", ""}, {"pod4", ""}}; 

我想此切换到一个ArrayList,因为我需要在存在编辑信息。

我该怎么做,但是使用多维ArrayList?我想用上面的信息初始化它。

我已经试过这样:

private ArrayList<ArrayList<String>> pods = new ArrayList(); 

每当我把括号之间的东西,我得到一个无效的操作错误。

顺便说一句,以防万一有人想知道 - 这不是班级作业。这是我自己尝试的。

谢谢。

回答

0

你可以尝试先建立内部的ArrayList,然后用pods.add将项目添加到您的pods的ArrayList:

// create your initial ArrayList 
private ArrayList<ArrayList<String>> pods = new ArrayList<ArrayList<String>>(); 

// create an ArrayList<String> to add to it 
private ArrayList<String> list1 = new ArrayList<String>(); 
list1.add("foo"); 

// create another 
private ArrayList<String> list2 = new ArrayList<String>(); 
list2.add("bar"); 

// add the inner ArrayLists to your main ArrayList 
pods.add(list1); 
pods.add(list2); 
2

首先,你的做法是半正确的。

对于二维数组,您可以有ArrayListArrayList s。

但是......

你初始化你的List原始类型。从Java 7,你可以改变你分配一个钻石型的推断:

List<List<String>> pods = new ArrayList<>(); 

在早期版本:

List<List<String>> pods = new ArrayList<List<String>>(); 

您还需要填充您的列表。

为此,您需要一些迭代。

这是一个完整的Java 7示例(使用List作为“代码到接口”指南建议)。

String[][] info = {{"pod1", ""}, {"pod2", ""}, {"pod3", ""}, {"pod4", ""}}; 
List<List<String>> pods = new ArrayList<>(); 
for (String[] level1: info) { 
    List<String> list = Arrays.asList(level1); 
    // use this instead if you intend to modify the inner lists 
    // List<String> list = new ArrayList<>(Arrays.asList(level1)); 
    pods.add(list); 
} 
System.out.println(pods); 

输出

[[pod1, ], [pod2, ], [pod3, ], [pod4, ]] 

现在,一些Java 8魔力:

String[][] info = {{"pod1", ""}, {"pod2", ""}, {"pod3", ""}, {"pod4", ""}}; 
List<List<String>> pods = 
    Arrays.stream(info) 
     .map((a) -> Arrays.asList(a)) 
     // use this instead if you intend to modify the inner lists 
     // .map((a) -> Arrays.stream(a).collect(Collectors.toList())) 
     .collect(Collectors.toList()); 
System.out.println(pods); 

(相同)输出

[[pod1, ], [pod2, ], [pod3, ], [pod4, ]] 
+0

'Arrays.asList'返回固定大小'List'。我相信你不能使用这个解决方案将元素附加到内部'List'。 –

+0

@ManosNikolaidis这是真的,虽然不是对原始问题的要求。最简单的解决方案是将我的猜测包装在构造函数中。 – Mena

0

您只需在数组上迭代并将项添加到列表中即可。 当您完成一行时,只需将列表添加到主列表。

List<List<String>> list = new ArrayList<List<String>>(); 
for (int i = 0 ; i < rowsCount ; i++) 
{ 
    List<String> temp = new ArrayList<String>(); 
    for (int j = 0 ; j < colsCount ; j++) 
    temp.add (arr[i][j]); 
    list.add (temp); 

} 

,或者你可以如下操作:

for (int i = 0 ; i < rowsCount ; i++) 
{ 
    list.add (Arrays.asList(arr[i])); 
} 

但是使用第二种方法可以防止你在任何索引

+0

单独的代码被认为是低质量的答案。你应该指出为什么这回答OP的问题 –

1

扩大各列表项如果你绝对要一个一个衬里就像你使用阵列时一样,你可以使用这个“单线”(你还需要import static java.util.Arrays.asList;):

List<List<String>> pods = new ArrayList<>(asList(
    new ArrayList<>(asList("pod1", "")), 
    new ArrayList<>(asList("pod2", "")), 
    new ArrayList<>(asList("pod3", "")), 
    new ArrayList<>(asList("pod4", "")) 
)); 
+0

我不认为你需要所有新的ArrayList <>位 - 你可以用asList()位来完成。此外,大多数情况下,您不应该在代码中引用ArrayList。 –

+0

不幸的是'asList'返回一个固定的大小'ArrayList'。如果需要在初始化后添加元素,则需要使用复制构造函数来创建“正确的”可调整大小的列表。否则,它会简化很多事情。 –

+0

并且OP确实提到需要编辑列表中的数据,所以足够公平 –