3

在 Java 中对 ArrayList 的 ArrayList 进行操作时遇到问题。我的代码中有这个东西-

ArrayList<ArrayList<Integer>> L1 = new ArrayList<ArrayList<Integer>>();

问题是,我不知道应该如何操作(添加、删除、遍历等)。我希望创建一个邻接列表(用于实现简单的无向图),我的导师建议我应该创建一个 ArrayList 的 ArrayList。我知道我可以执行以下操作来添加新元素-

L1.add(//Something I want to add);

但是由于显而易见的原因,这在当前情况下会引发错误。

4

6 回答 6

2

anArrayList的 an ArrayList,只要认为外部对象是 anArrayList就完成了。

ArrayList<ArrayList<Integer>> list2d = new ArrayList<ArrayList<Integer>>();
// add an element to the list
list2d.add(new ArrayList<Integer>());
// retrieve a list 
ArrayList<Integer> list1d = list2d.get(0);
// add an integer
list2d.get(0).add(123);

顺便说一句,邻接表只是边的列表,不需要为每个顶点存储它们,尤其是在图是无向的情况下。一个列表Edge就足够了:

class Edge {
  Vertex v1, v2;
}

ArrayList<Edge> adjacencyList;

如果您想基于每个顶点存储它们,那么您可以通过将边封装在顶点类本身内来避免使用列表列表,但这将需要两倍的边:

class Vertex {
  int value;
  ArrayList<Vertex> adjacency;
}

但哪个最好取决于您需要在图表上执行哪种操作。对于小图,没有实际区别。

另一种可能的实现,如果您只需要知道两个顶点是否连接:

class Edge {
  public final int v1, v2;

  public boolean equals(Object o) { return o != null && o instanceof Edge && o.hashCode() == hashCode(); }

  public int hashCode() { return v1 ^ v2; } // simple hash code, could be more sophisticated
}

Set<Edge> adjacencyList = new HashSet<Edge>();
于 2013-10-01T15:06:28.737 回答
1

试试L1.get(i).add(whatever);,当然先检查是否L1.get(i)存在,否则先添加那个内部列表。

是这样的:

List<List<Integer>> L1 = new ArrayList<List<Integer>>(); //better use interfaces

List<Integer> first = null;
if( L1.size() > 0) {
 first = L1.get(0); //first element
}
else {
  first = new ArrayList<Integer>();
  L1.add(first);      
}

first.add(4711); //or whatever you like to add
于 2013-10-01T15:04:21.123 回答
1
L1.add(new ArrayList<Integer>());

将在第一个列表中创建一个新列表。那么你也能

L1.get(0).add(5)
于 2013-10-01T15:05:35.903 回答
1
List<List<Integer>> L1 = new ArrayList<ArrayList<Integer>>();    
List<Integer> list1 = new ArrayList<Integer>();     
list1.add(1);
list1.add(2);
list1.add(3);
list1.add(4);
list1.add(5);

//将列表添加到列表中

L1.add(list1); 

遍历列表列表

for( List<Integer> list: L1 ){
      for(Integer i:list){
          System.out.println(i);
      }
}
于 2013-10-01T15:06:09.777 回答
1

您只能将 ArrayList 类型的对象添加到 L1。所以你可以这样做:

ArrayList<ArrayList<Integer>> firstList = new ArrayList<ArrayList<Integer>>();

ArrayList<Integer> secondList = new ArrayList<Integer>();
secondList.add(0);

firstList.add(secondList);
于 2013-10-01T15:06:21.820 回答
1

向外部数组添加新元素:

ArrayList<Integer> inner = new ArrayList<Integer>();
L1.add(inner);

然后将元素添加到内部数组:

   int exampleInt = 10;
   ArrayList<Integer> inner = L1.get(0);
   inner.add(exampleInt);

遍历所有数组中的所有元素:

   for (ArrayList<Integer> inner : L1)
   {
      for (Integer element : inner)
      {
         System.out.println(element);
      }
   }
于 2013-10-01T15:07:36.263 回答