Mar*_*sco 27
所有其他答案在技术上都是正确的,但恕我直言,如果您实施一个粗略的列表列表列表,您不会在正确的抽象级别处理您的数据.例如,我很确定列表列表在您的业务领域中已经意味着"某些东西".将此"东西"封装在另一个对象中,这样您就可以使用List <Something>而不是难以使用和维护List <List <List <Object >>>.
jjn*_*guy 12
正如马里奥所说,你可能需要进一步抽象出你的数据.但是,以下将满足您的需求.
在Java中你会这样:
List<List<List<Object>>> listOfListsOfLists =new ArrayList<List<List<Object>>>();
Run Code Online (Sandbox Code Playgroud)
然后要访问这些项目,您将使用:
listOfListsOfLists.get(a).get(b).get(c);
Run Code Online (Sandbox Code Playgroud)
或者,迭代所有内容:
for (List<List<Object>> list2: listOfListsOfLists) {
for (List<Object> list1: list2) {
for (Object o: list1) {
// use `o`
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于所有这些答案都让我成为barf,我可以添加你的建议吗?
创建数据类型以表达您的数据,同时封装结构的细节,或至少
创建一个包装int []的键类型(但正确覆盖equals和hashCode)并使用HashMap代替?无论如何,您的整个三维结构通常很少被填满.
更好的是,您可以封装该映射并使用varargs进行干净访问.
public class NDimensionalArray<V> {
private final int dimensions;
private final Map<Key, V> values = new HashMap<Key, V>();
private NDimensionalArray(int dimensions) {
this.dimensions = dimensions;
}
public V get(int... indices) {
checkIndices(indices);
return values.get(new Key(indices));
}
public void set(V value, int... indices) {
checkIndices(indices);
values.put(new Key(indices), value);
}
private void checkIndices(int[] indices) {
if ( indices.length != dimensions ) {
throw new IllegalArgumentException();
}
}
private static final class Key {
private final int[] indices;
private Key(int[] indices) {
this.indices = indices;
}
@Override
public int hashCode() {
return Arrays.hashCode(indices);
}
@Override
public boolean equals(Object obj) {
return Arrays.equals(indices, ((Key)obj).indices);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果人们有已建立的集合库的例子已经做过这种事情,请告诉我,我会添加链接.