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

이렇게하면 첫 번째 목록에 목록이 계속 추가됩니다. 일어날 필요가있는 것은 처음 2 목록이 병합되고 다음 2 편지가 병합됩니다. 마지막 목록까지 계속됩니다. 그런 다음 바깥 쪽이 모든 목록이 병합 될 때까지 프로세스를 반복 실행합니다. L1 L2 L3 L4 L5 -> L1 + L2 L3 + L4 L5 -> L1 + L3 L5 -> L1 + L5 -> L1 – shivster

+0

이것을 솔루션으로 받아들이면, 나를 위해 속임수를 쓸 것이다. 이걸 도와 주셔서 고맙습니다. 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