【问题标题】:Write a method that merges two array lists, alternating elements from both array lists编写一个合并两个数组列表的方法,从两个数组列表中交替元素
【发布时间】:2013-04-16 11:11:52
【问题描述】:

写一个方法

公共静态 ArrayList 合并(ArrayList a, ArrayList b)

合并两个数组列表,两个数组列表中的元素交替出现。如果一个数组列表比另一个短,则尽可能交替,然后从较长的数组列表中附加剩余的元素。例如,如果 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 中将一个数字添加到合并数组列表中i 是一个奇数。但是,我不确定如何处理一个数组列表可能比另一个更长的事实。谁能帮帮我?

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

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

【问题讨论】:

  • 同上。并查看List.iterator()
  • 好的,抱歉。我只是认为代码质量太低了,不值得发布。但是,你们中的任何人都可以为我提供一种比使用 List 迭代器更“基本”的方法吗?
  • 发布您的代码,即使质量很差,也显示了您为解决问题所做的努力,因此您更有可能得到答案并且不太可能被否决:)

标签: java


【解决方案1】:

我遇到了同样的情况,下面是我的解决方案:

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

【讨论】:

    【解决方案2】:

    好的,我的建议是使用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));
        }
    

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

    【讨论】:

      【解决方案3】:

      我在 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>";
          }
      ?>
      

      【讨论】:

        【解决方案4】:

        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]+" ");
        }
        
        }
        

        }

        【讨论】:

          【解决方案5】:

          这是我的解决方案

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

          【讨论】:

          • 这是一个很好的解决方案.. 但是 while(conditon1 && condition2) 替换为 while(conditon1 || condition2)
          【解决方案6】:

          试试这个:我用数组​​实现的。

          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]
          

          【讨论】:

          • 谢谢你:)。你的回答和山姆的回答都是关于我正在寻找的东西。非常感谢:)。
          【解决方案7】:

          试试这个

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

          【讨论】:

            【解决方案8】:

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

            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作为方法参数类型

            【讨论】:

            • 谢谢,但是,我认为我不应该使用“迭代器”,因为我的讲座中从未涉及过这些。我知道这可能是解决问题的最优雅的方法,但是还有更基本和直观的方法吗?
            • mause,你应该能够从这个例子中自己推断出来。这应该可以帮助您朝着正确的方向前进,即使您以前没有见过迭代器。
            • @mause:我不会考虑“更基本或更直观”的其他方式,但为了记录,我添加了一个“按索引访问”解决方案
            【解决方案9】:

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

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

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

            【讨论】:

              【解决方案10】:

              没有迭代器:

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

              【讨论】:

              • 如果您明确将列表内容转换为Integer,我会将该信息提升为方法签名。您的方法看起来可以合并ArrayList&lt;Object&gt;,这是不正确的。另一方面,演员表是不必要的......
              • @LukasEder 我假设,给出了方法签名,所以我无法更改它。不过我明白你的意思。
              • @Sam:是的,但是,演员阵容很危险(实际上是不必要的)
              猜你喜欢
              • 2022-12-08
              • 2021-11-09
              • 2020-02-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多