2014-07-17 57 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

相关问题