簡體   English   中英

如何在Java中對ArrayList的ArrayList進行操作?

[英]How to operate on an ArrayList of ArrayList in Java?

在Java中操作ArrayList的ArrayList時遇到問題。 我的代碼中有這個東西 -

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

問題是,我不知道我應該如何對此進行操作(添加,刪除,遍歷等)。 我希望創建一個鄰接列表(用於實現簡單的無向圖),我的教師建議我應該創建一個ArrayList的ArrayList。 我知道我可以做以下添加新元素 -

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

但由於顯而易見的原因,這在當前案例中引發了錯誤。

ArrayListArrayList ,只是認為外部對象是一個ArrayList ,你就完成了。

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>();

試試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
L1.add(new ArrayList<Integer>());

將在第一個列表中創建一個新列表。 那么你也能

L1.get(0).add(5)
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);
      }
}

您只能將ArrayList類型的對象添加到L1。 所以你可以這樣做:

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

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

firstList.add(secondList);

要將新元素添加到外部數組:

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);
      }
   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM