如何用另一个不同大小的ArrayList替换ArrayList的所有元素?

时间:2016-06-15 11:54:58

标签: java arrays arraylist collections

给定两个排序的整数数组A和B,将B合并为A作为一个排序数组。

  

注意:您必须修改数组A以包含A和B的合并。   不要在代码中输出任何内容。提示:C用户,请malloc了   结果进入一个新数组并返回结果。

如果A和B中初始化的元素数分别为m和n,则执行代码后数组A的结果大小应为m + n

示例:

Input : 
         A : [1 5 8]
         B : [6 9]

Modified A : [1 5 6 8 9]

我的解决方案:

public class Solution {
    public void merge(ArrayList<Integer> a, ArrayList<Integer> b) {

        int i=0,j=0;
        ArrayList<Integer> al= new ArrayList<Integer>();

        while(i<a.size() && j<b.size()){
            if(a.get(i)<b.get(j)){
            al.add(a.get(i));
            i++;
        }

        else{
            al.add(b.get(j));
            j++;
        }
    }

    while(i<a.size()){
        al.add(a.get(i));
        i++;
    }

    while(j<b.size()){
        al.add(b.get(j));
        j++;
    }
}

我创建了第3个ArrayList,我合并了第一个和第二个ArrayLists的所有元素。现在我必须将3rd ArrayList的所有元素复制到第一个。 我现在被困住了。因为,当我使用

调整大小时
public static void ensureSize(ArrayList<Integer> list, int size){
    list.ensureCapacity(size);
    while(list.size()<size){
        list.add(null);
    }
}

ensureSize(a,al.size());
for(int k=0;k<al.size();k++){
     a.set(k,al.get(k));
}

它给了我ArrayIndexOutOfBound错误。我试过了Collections.copy(a,al),它也没有用。

3 个答案:

答案 0 :(得分:5)

由于两个给定的数组已经排序

  

输入:A:[1 5 8] B:[6 9]

     

修改A:[1 5 6 8 9]

你可以这样做:选项:1

public static int[] merge(int[] a, int[] b) {

    int[] answer = new int[a.length + b.length];
    int i = 0, j = 0, k = 0;

    while (i < a.length && j < b.length)
    {
        if (a[i] < b[j])       
            answer[k++] = a[i++];

        else        
            answer[k++] = b[j++];               
    }

    while (i < a.length)  
        answer[k++] = a[i++];


    while (j < b.length)    
        answer[k++] = b[j++];

    return answer;
}

注意:我使用的是数组而不是ArrayList,因为我认为这就是问题所要求的。此外,了解concept of merging sorted arrays非常有帮助,此链接也会有所帮助。

另一种选择,如果你想真正时髦选项:2

public static int[] merge(int[] a, int[] b) {

    int[] answer = new int[a.length + b.length]
    int i = a.length - 1, j = b.length - 1, k = answer.length;

    while (k > 0)
        answer[--k] = 
            (j < 0 || (i >= 0 && a[i] >= b[j])) ? a[i--] : b[j--];
}

但如果你真的想使用Lists那么我会做这样的事情:选项:3

public static <T> ArrayList<T> merge(List<T> a, List<T> b) {
    ArrayList<T> result = new ArrayList<T>();
    int size = Math.max(a.size(), b.size());

    for (int i = 0; i < size; i++) {
        if (i < a.size()) result.add(a.get(i));
        if (i < b.size()) result.add(b.get(i));
    }
    return result;
}

如果列表确实是唯一的选项,我可能甚至不会使用我自己的算法,你可以简单地使用内置函数,例如:选项:4

List<Integer> all = new ArrayList<Integer>();
all.addAll(list1);
all.addAll(list2);

Collections.sort(all);

这最后一个算法适用于最初不按排序顺序排列的数组,我认为你不是在寻找它,但它是一个选项。

如何执行选项:3

public static void main(String[] args){
    List<Integer> l1 = Arrays.asList(1,5,7,9);
    List<Integer> l2 = Arrays.asList(4,3,11);
    System.out.println(merge(l1,l2));
}

根据我收集的内容,您还希望将新ArrayList与第一个ArrayList合并,并删除所有重复内容,我会这样做:

for (Object x : two){
   if (!one.contains(x))
      one.add(x);
}

这有already been answered on this post,请查看

答案 1 :(得分:0)

要完成答案,请在返回答案之前将以下代码添加到上述解决方案中;

a = new int[answer.length];
a = Arrays.copyOf(answer, answer.length);

并更改

return answer; 

return a;

答案 2 :(得分:0)

我相信使用以下内容可以更简单地解决这个问题。

  • 维护两个数组的索引,并从较小的元素中读取。
  • 我建议总是使用for循环而不是while()循环,它们更容易推理。
  • 避免使用像i和j这样的变量,这是一个拼写错误的方法......

实施例

[X,T] = simpleseries_dataset;
Y=mat2cell(cellfun(@(x) x*2,X),1,ones(1,100))


net = narxnet(1:2,1:3); %classic narxnet 
net.numInputs = 3; % adding an input
net.inputConnect  =[1 1 1; 0 0 0]; %connecting 3 inputs to the first layer

%defining input 3
net.inputs{3}.name = 'Input3';
net.inputs{3}.processFcns = {'mapminmax'}; %whaterever you want, but remember to set them
net.inputWeights{1,3}.delays= 1:4; % the actual delay value for an input
view(net) %

%prepare and close
[Xs,Xi,Ai,Ts] = preparets(net,[X;Y],{},T); %train with exogene inputs
net = train(net,Xs,Ts,Xi,Ai);
net = closeloop(net);
view(net) %please note that the order of inputs is switched in the picture

%prepare and use
[Xs,Xi,Ai,Ts] = preparets(net,[X;Y],{},T);
T2 = net(Xs,Xi,Ai);

%if you want to see the results
plot(cell2mat(T(5:96)))
hold on
plot(cell2mat(T2))