Java 清单清单
我是Java新手,我需要列出一个列表。我可以在python中这样做,因为列表的元素可以是列表,所以在嵌入式列表中,Java 清单清单,java,list,Java,List,我是Java新手,我需要列出一个列表。我可以在python中这样做,因为列表的元素可以是列表,所以在嵌入式列表中,list[0]将引用列表,list[0][0]将引用嵌入式列表的第零个元素。有什么简单的方法可以在java中实现这种行为吗?如前所述,您可能需要进一步抽象数据。但是,以下内容将满足您的需要 在Java中,您可以这样做: List<List<List<Object>>> listOfListsOfLists =new ArrayList<Lis
list[0]
将引用列表,list[0][0]
将引用嵌入式列表的第零个元素。有什么简单的方法可以在java中实现这种行为吗?如前所述,您可能需要进一步抽象数据。但是,以下内容将满足您的需要
在Java中,您可以这样做:
List<List<List<Object>>> listOfListsOfLists =new ArrayList<List<List<Object>>>();
或者,迭代所有内容:
for (List<List<Object>> list2: listOfListsOfLists) {
for (List<Object> list1: list2) {
for (Object o: list1) {
// use `o`
}
}
}
for(列表2:listOfListsOfLists){
对于(列表1:列表2){
for(对象o:list1){
//使用'o'`
}
}
}
既然所有这些答案都让我呕吐,我能补充一点建议吗
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);
}
}
}
公共类NDimensionalArray{
私有最终整数维;
私有最终映射值=新HashMap();
专用NDimensionalArray(整数维){
这一点。尺寸=尺寸;
}
公共V get(int…索引){
检查指数(指数);
返回值.get(新键(索引));
}
公共无效集(V值,整数…索引){
检查指数(指数);
值。put(新键(索引),值);
}
私有void检查索引(int[]索引){
if(index.length!=尺寸){
抛出新的IllegalArgumentException();
}
}
私有静态最终类密钥{
私人最终综合指数;
私钥(int[]索引){
该指数=指数;
}
@凌驾
公共int hashCode(){
返回数组。哈希代码(索引);
}
@凌驾
公共布尔等于(对象obj){
返回数组.equals(索引,((键)obj).index);
}
}
}
如果人们有已经建立的集合库的示例,它们已经做了这类事情,请告诉我,我将添加链接。一个显示集合和泛型列表的综合示例(Java 1.5+)
//声明列表的列表
List ListofListofString=new ArrayList();
//填充
List listofstring=new ArrayList();//一个内部列表
添加(“一个”);
添加(“一两”);
添加(listOfStrings);
listOfStrings=newarraylist();//还有一个
添加(“两个一”);
添加(“两个两个”);
添加(listOfStrings);
//通路
String one=listofListofString.get(0.get(0);//第一个内部列表的第一个元素
String twoo=listofListofString.get(1).get(1);//第二个内部列表的第二个元素
所有其他答案在技术上都是正确的,但是如果你实现了一个粗略的列表列表,你就没有在正确的抽象层次上处理数据。例如,我非常确定列表列表在您的业务领域中已经意味着“某物”。将这个“某物”封装到另一个对象中,这样您就可以拥有一个列表,而不是一个难以使用和维护的列表。虽然您确实可以用Java构建一个列表,但我不禁要问,您为什么要这样做?这并不是说这是解决你问题的最好办法,而是为什么
我想我可以想象这样的事情
public class Employee ...
List<Employee> store; // all the employees in a store
List<List<Employee>> city; // all the store lists for a city
List<List<List<Employee>>> nation; // all the store lists for the nation
公共类员工。。。
列表存储;//商店里所有的员工
列出城市;//一个城市的所有商店名单
国家名单;//全国所有的商店名单
但你真的想这样处理吗?我不知道,这取决于您需要如何处理它。要么我遗漏了什么,要么这里有一个缺陷-数组哈希代码基于标识,而不是数组中的值-您的映射键无法按预期工作?如果值范围允许非冲突哈希代码(即索引0..1000和哈希代码=1000000*A[2]+1000*A[1]+A[0]),则基于这些值定义哈希代码的dataholder类将起作用@rsp:谢谢,你完全正确。有点太匆忙了。现在已经修好了(尽管我还没有测试)。只要正确实现equals,hashcode就不必是非冲突的(毕竟,无限空间类的所有hashcode最终都会冲突)。在某些语言中(无可否认,由于其冗长的语法,不典型的Java),使用列表列表列表对于原型化来说是非常常见的。对于探索性编程,当您没有在任何地方嵌入显式名称时,进行更改会容易得多。一旦你在编写EnterpriseyWeb应用程序,当然,你需要“正确的抽象级别”和“你的业务领域”,但如果你在编写一个程序来完成“我还不知道该做什么,但让我们看看这会发生什么”,列表是很好的。Linux内核一开始也不是完美的,甚至不是作为一个操作系统内核。在我的工作生涯中,我无数次听到这样的理由:“我将从一个列表列表开始,我将看看会发生什么,然后我将重构它。”这在bast案例中是一厢情愿的想法,或者更可能只是一个谎言,其最终结果是可怕的列表列表将永远保留在代码中。如果您已经知道有更好的方法来编写代码(而且您似乎同意可以做得更好),为什么不从最好的方法开始呢?您只需要花几分钟的时间来封装。。。就这么做吧,要优雅!编译器“认为”
add
是包listOfStrings
中的一个类(这是显而易见的)
// declare the list of lists
List<List<String>> listOfListOfStrings = new ArrayList<List<String>>();
// populate
List<String> listOfStrings = new ArrayList<String>(); // one inner list
listOfStrings.add("one-one");
listOfStrings.add("one-two");
listOfListOfStrings.add(listOfStrings);
listOfStrings = new ArrayList<String>(); // and another one
listOfStrings.add("two-one");
listOfStrings.add("two-two");
listOfListOfStrings.add(listOfStrings);
// access
String oneOne = listOfListOfStrings.get(0).get(0); // first element of first inner list
String twoTwo = listOfListOfStrings.get(1).get(1); // second element of second inner list
public class Employee ...
List<Employee> store; // all the employees in a store
List<List<Employee>> city; // all the store lists for a city
List<List<List<Employee>>> nation; // all the store lists for the nation