2014-07-17 58 views
0

代碼的用途是遍歷ArrayList> listOfLists中的每個項目,並將前一個列表合併到當前列表中,對當前列表進行排序並刪除下一個列表(自從已經合併)。這需要發生,直到只剩下一個列表。藉此,我可以將ArrayList.get(0)的內容吐出到文件中。Java ArrayList將當前項添加到上一項;刪除當前項目

listOfLists在代碼段之前定義。 我在苦苦掙扎的是:alStr1內容如何被髮送回listOfLists.get(0)?

while (listOfLists.size() > 1) { 
    System.out.println(">>>>>>>>>>>>>Iteration"+i); 
    Iterator<ArrayList<String>> itr = listOfLists.iterator(); 
    while(itr.hasNext()) { 
     ArrayList<String> alStr1 = itr.next(); 
     try{ 
      ArrayList<String> alStr2 = itr.next(); 
      alStr1.addAll(alStr2); 
      Collections.sort(alStr1); 
      itr.remove(); 
     }catch (NoSuchElementException e){ 
      e.printStackTrace(); 
      break; 
     } 
    } 
} 

提供任何意見,非常感謝。 謝謝

LOGIC: 
------ 
L1 L2 L3 L4 L5 --> L1+L2 L3+L4 L5 
L1+L2 L3+L4 L5 --> L1+L3 L5 
L1+L3 L5 --> L1+L5 
L1+L5 --> L1 

L1 => going to a file. 

listOfLists will include these 5 lists: 
L1: [100,101,102] 
L2: [200,201,202] 
L3: [300,301,302] 
L4: [400,401,402] 
L5: [500,501,502] 
Iteration 1: 
L1 = L1+L2>> [100,101,102,200,201,202] 
L3 = L3+L4>> [300,301,302,400,401,402] 
L5 = L5 >> [500,501,502] 

Iteration 2: 
L1 = L1+L3>> [100,101,102,200,201,202,300,301,302,400,401,402] 
L5 >> [500,501,502] 

Iteration 3: 
L1 = L1+L5>> [100,101,102,200,201,202,300,301,302,400,401,402,500,501,502] 

這將解釋我正在嘗試實現。請原諒我不先加入。

+0

您不在排序組合列表 - 您正在排序「下一個」列表,然後將其添加到「當前」列表中。但我不確定你爲什麼這樣做。你肯定需要這條有點複雜的路線嗎?難道你不能只遍歷所有的列表,並按照順序將它們添加到第一個列表中? (你最終需要'listOfLists',還是隻需要單個組合列表?)更多的上下文會有所幫助。 –

+0

@JonSkeet:對於上下文,這是排序算法的一部分。我試圖實現半合併排序。在那裏,我想分解多個部分的數據集並分別對每個部分進行排序,然後開始合併並對它們進行排序,直到所有列表被合併和排序。合併排序會將記錄分解到單個元素並開始合併和排序。 – shivster

+0

@JonSkeet:你排列第二個列表而不是組合列表是正確的。它應該是alStr1。編輯代碼以反映這一點。 – shivster

回答

1
public static void main(String[] args) { 

      List<List<Integer>> listOfList = new ArrayList<List<Integer>>(); 

      Random rand = new Random(System.currentTimeMillis()); 

      for (int i = 0; i < 5; i++) { 
       List<Integer> list = new ArrayList<Integer>(); 
       for (int j = 0; j < 5; j++) { 
        list.add(rand.nextInt(1000)); 
       } 
       listOfList.add(list); 
      } 

      while (listOfList.size() > 1) { 

       Iterator<List<Integer>> itr = listOfList.iterator(); 
       List<Integer> first = itr.next(); 

       while (itr.hasNext()) { 
        List<Integer> temp = itr.next(); 
        first.addAll(temp); 
        itr.remove(); 
        Collections.sort(first); 
       } 
      } 

      List<Integer> first = listOfList.get(0); 
      for (Integer integer : first) { 
       System.out.print(integer + ", "); 
      } 
     } 
+0

這將繼續添加列表到第一個列表。需要發生的是,前兩個列表合併,接下來的兩個將合併,直到最後一個列表。然後,外面的一會兒將會開始並重復這個過程,直到所有的列表被合併爲止。 L1 L2 L3 L4 L5 - > L1 + L2 L3 + L4 L5 - > L1 + L3 L5 - > L1 + L5 - > L1 – shivster

+0

接受這個解決方案,只需在while循環內移動第一個列表將爲我做詭計。感謝您幫助我。 while(itr.hasNext()){ \t first = itr.next(); \t if(itr.hasNext()){ \t \t temp = itr.next(); \t \t first.addAll(temp); \t \t itr.remove(); \t} – shivster

相關問題