编写一个合并两个数组列表的方法,交替使用两个数组列表中的元素

时间:2013-04-23 09:37:10

标签: java

写一个方法

  

public static ArrayList merge(ArrayList a,ArrayList b)

合并两个数组列表,交替使用两个数组列表中的元素。如果一个数组列表比另一个更短,则只要可以替换,然后从较长的数组列表中追加剩余的elemts。例如,如果a是

  

1 4 9 16

和b是

  

9 7 4 9 11

然后merge返回数组列表

  

1 9 4 7 9 4 16 9 11


我尝试做的是使用if语句编写for循环,以便当i是偶数(i%2 == 0)时从数组列表a添加一个数字,并从数组列表b添加我是一个奇数。然而,我不知道如何处理一个数组列表可能比另一个更长的事实。有人可以帮帮我吗?

编辑:好的,这是代码(但它远非正确):

public static ArrayList<Integer> merge(ArrayList<Integer> een, ArrayList<Integer> twee)
{
    ArrayList<Integer> merged = new ArrayList<Integer>();

    for(int i = 0; i<100; i++)
    {           
        if(i%2!=0)
        {
            merged.add(a.get(i));
        }   
        if(i%2 == 0)
        {
            merged.add(b.get(i));
        }               
    }

    System.out.println(merged);
    return merged;
}

10 个答案:

答案 0 :(得分:12)

迭代器似乎最容易做到这一点

public static <T> ArrayList<T> merge(Collection<T> a, Collection<T> b) {
    Iterator<T> itA = a.iterator();
    Iterator<T> itB = b.iterator();
    ArrayList<T> result = new ArrayList<T>();

    while (itA.hasNext() || itB.hasNext()) {
        if (itA.hasNext()) result.add(itA.next());
        if (itB.hasNext()) result.add(itB.next());
    }

    return result;
}

没有迭代器:

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;
}

注意,我稍微放松了方法签名。如果您使用迭代器实现合并,Collection(甚至Iterable)将会执行。否则,List会这样做。无需ArrayList作为方法参数类型

答案 1 :(得分:4)

试试这个:我使用Array实现。

public static void main(String[] args) {
    int[] first = { 1, 4, 9, 16 };
    int[] second = { 9, 7, 4, 9, 11 };
    int[] merge = new int[first.length + second.length];
    int j = 0, k = 0, l = 0;
    int max = Math.max(first.length, second.length);
    for (int i = 0; i < max; i++) {
        if (j < first.length)
            merge[l++] = first[j++];
        if (k < second.length)
            merge[l++] = second[k++];
    }
    System.out.println(Arrays.toString(merge));
}

输出:

[1, 9, 4, 7, 9, 4, 16, 9, 11]

答案 2 :(得分:3)

没有迭代器:

public static ArrayList merge(ArrayList a, ArrayList b) {
    int c1 = 0, c2 = 0;
    ArrayList<Integer> res = new ArrayList<Integer>();

    while(c1 < a.size() || c2 < b.size()) {
        if(c1 < a.size())
            res.add((Integer) a.get(c1++));
        if(c2 < b.size())
            res.add((Integer) b.get(c2++));
    }
    return res;
}

答案 3 :(得分:2)

您不需要检查模数,或者您将跳过每个输入列表中的每个第二个元素。

public static <E> List<E> merge(List<E> een, List<E> twee) {
    List<E> merged = new ArrayList<E>(een.size() + twee.size());
    List<E> shorter = een.size() <= twee.size() ? een : twee;
    List<E> longer = een.size() > twee.size() ? een : twee;
    for (int i = 0; i < shorter.size(); i++) {
        merged.add(een.get(i));
        merged.add(twee.get(i));
    }
    for (int i = shorter.size(); i < longer.size(); i++) {
        merged.add(longer.get(i));
    }
    return merged;
}

此通用版适用于所有类型的列表和泛型类型。

答案 4 :(得分:1)

这是我的解决方案

LinkedList<Integer> list3 = new LinkedList<Integer>();


Iterator<Integer> itA = list.iterator();
Iterator<Integer> itB = list2.iterator();

while(itA.hasNext() && itB.hasNext()){
    list3.add(itA.next());
    list3.add(itB.next());
}

答案 5 :(得分:0)

试试这个

Iterator iterator1 = arr1.iterator();
     Iterator iterator2 = arr2.iterator();
     while (iterator1.hasNext() || iterator2.hasNext()) {
       if(iterator1.hasNext()){
         mergerArr.add(iterator1.next());
       }
       if(iterator2.hasNext()){
         mergerArr.add(iterator2.next());
       }
     }

答案 6 :(得分:0)

Array1 = {1,2,3} Array2 = {a,b,c,d,e}

输出= {1,a,2,b,3,c,d,e}

公共类MergeArray {

public static void main(String args[])
{
char [] arr1= {'1','2','3'};
char [] arr2= {'a','b','c','d','e'};


int l1= arr1.length;
int l2=arr2.length;

int l3=l1+l2;

char [] arr3=new char[l1+l2];

int i=0;
int j=0;
int k=0;
int m=0;
int r=0;

if(l1<l2)
    r=l1;
else
    r=l2;

while(m<r)
{
    arr3[k++]=arr1[i++];
    arr3[k++]=arr2[j++];
    m++;
}

while(k<l3)
{
    if(l1<l2)
        arr3[k++]=arr2[j++];
    else
        arr3[k++]=arr1[i++];
}

for(int n=0;n<l3;n++)
{
    System.out.print(arr3[n]+" ");
}

}

}

答案 7 :(得分:0)

我在php中以下列方式完成了这个:

<?php
    $list1 = array("a","b","c");
    $list2 = array(1,2,3);
    $list3 = array();
    $j=0;
    $k=0;

    for($i=0;$i<6;$i++)
    {
        if($i%2==0)
        {
            $list3[$i]=$list1[$j];
            $j++;
        }

        else
        {
            $list3[$i]=$list2[$k];
            $k++;
        }

        echo $list3[$i]."<br>";
    }
?>

答案 8 :(得分:0)

好的,我的建议是使用ArrayList:

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String[] list1 = in.nextLine().split(",");
        String[] list2 = in.nextLine().split(",");
        ArrayList<String> merged = new ArrayList<>();
        for (int i = 0; i < Math.max(list1.length,list2.length); i++) {
                merged.add(list1[i]);
                merged.add(list2[i]);
        }
        System.out.println(String.join(",", merged));
    }

如果确定输入仅是数字,则可以将代码更改为Integer。

答案 9 :(得分:0)

我有同样的情况,下面是我的解决方法:

// array list to hold the merged list
ArrayList<Integer> mergedList = new ArrayList<Integer>();

// Get the bigger size
int maxSize = listOne.size() > listTwo.size() ? listOne.size() : listTwo.size();

// Loop thru the list
for( int i = 0; i <= maxSize; i++){
    // We need to check first if index exist then just add it to mergeList
    if( i < listOne.size() ) mergedList.add( listOne.get( i ) );
    // We need to check first if index exist then just add it to mergeList
    if( i < listTwo.size() ) mergedList.add( listTwo.get( i ) );
}