2017-05-20 85 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++; 
      }