2017-05-20 86 views
0

這裏是我的代碼:合併兩個排序的ArrayList到一個ArrayList中排序

for (int i = 0, j = 0; i < array1.size() && j < array2.size();) { 
    if (array1.get(i) < array2.get(j)) { 
     list.add(array1.get(i)); 
     i++; 
    } else { 
     list.add(array2.get(j)); 
     j++; 
    } 
} 

的問題是,我不能去的人數最多。例如,如果我有兩個數組{1,3,5}和{2,4,6},則該代碼給出{1,2,3,4,5}。我該如何解決它?

+3

你的代碼幾乎是正確的,只要想一想當你使用其中一個數組的所有元素時會發生什麼。 – NiVeR

+0

當array2中的最後一個元素仍然存在時,我 poisonedYouth

+0

你想要的結果是什麼? –

回答

1

使用流的答案是正確的,但我想提供您的完整性代碼啓動解決方案。

int i, j; 
for (i = 0, j = 0; i < array1.size() && j < array2.size();) { 
    if (array1.get(i) < array2.get(j)) { 
     list.add(array1.get(i)); 
     i++; 
    } else { 
     list.add(array2.get(j)); 
     j++; 
    } 
} 

while(i < array1.size()) list.add(array1.get(i++)); 
while(j < array2.size()) list.add(array2.get(j++)); 
0

如果i < array1.size()j < array2.size()條件中的一個條件失敗,表示它不會處理(並排序)其他數組中的其餘元素,則您的for循環將退出。

這裏的stream方法來連接和排序兩個數組:

int[] a1 = new int[]{1,3,5}; 
int[] a2 = new int[]{2,4,6}; 
List<Integer> result = IntStream.concat(Arrays.stream(a1), Arrays.stream(a2)) 
    .boxed() 
    .sorted() 
    .collect(Collectors.toList()); 

System.out.println(result); 
0

整數加最大價值在兩個名單的末尾,改變and條件or條件

List<Integer> array1 = new ArrayList<>(Arrays.asList(1, 3, 5)); 
List<Integer> array2 = new ArrayList<>(Arrays.asList(2, 4, 6)); 

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

array1.add(Integer.MAX_VALUE); //Add Integer Max Value 
array2.add(Integer.MAX_VALUE); //Add Integer Max Value 

for (int i = 0, j = 0; i < array1.size() - 1 || j < array2.size() - 1;) { 
    if (array1.get(i) < array2.get(j)) { 
     list.add(array1.get(i)); 
     i++; 
    } else { 
     list.add(array2.get(j)); 
     j++; 
    } 
} 

System.out.println(list); 

array1.remove(array1.size() - 1); //Remove Integer Max Value 
array2.remove(array2.size() - 1); //Remove Integer Max Value 
0

在上面的代碼中你使用的病情,我< array1.size() & & j < array2.size()因此,如果一個列表首先耗盡,那麼它將超出循環,並且不會處理第二個列表中的剩餘元素。所以在循環之後,如果計數器需要處理列表沒有達到最後。

int i = 0; 
      int j = 0; 
      while (i < array1.size() && j < array2.size()) { 
       if (array1.get(i) < array2.get(j)) { 
        list.add(array1.get(i)); 
        i++; 
       } else { 
        list.add(array2.get(j)); 
        j++; 
       } 
      } 
      while (i < array1.size()) { 
       list.add(array1.get(i)); 
       i++; 
      } 
      while (j < array2.size()) { 
       list.add(array2.get(j)); 
       j++; 
      }