0

我为以下场景做了很多工作,但我无法获得所需的输出。

我陷入了以下情况:

Arraylist1 = {10,20,30};
Arraylist2 = {4,5,7}

我希望输出为:

Combined: [10, 4, 10, 5, 10, 7, 20, 4, 20 ,5, 20, 7, 30, 4, 30, 5, 30, 7]

我所做的一切如下:

 ArrayList<Integer> numbers = new ArrayList<Integer>();
 numbers.add(10); numbers.add(20); numbers.add(30); numbers.add(40);


 ArrayList<Integer> numbers2 = new ArrayList<Integer>();
 numbers2.add(4); numbers2.add(5); numbers2.add(7);

 List<Integer> interleaved = interleave(numbers, numbers2);

 System.out.println("\nCombined: " + interleaved);


 public static List<Integer> interleave(final List<Integer> list1, final List<Integer> list2) {
     List<Integer> result = new ArrayList<Integer>(list2.size() + list1.size());

     Iterator<Integer> it1 = list1.iterator();
     Iterator<Integer> it2 = list2.iterator();
     while (it1.hasNext() || it2.hasNext()) {
         if (it1.hasNext()) {
             result.add(it1.next());
         }
         if (it2.hasNext()) {
             result.add(it2.next());
         }
     }
     return result;
 }

但我得到的输出是

Combined: [10, 4, 20, 5, 30, 7]

我希望输出像

Combined: [10, 4, 10, 5, 10, 7, 20, 4, 20 ,5, 20, 7, 30, 4, 30, 5, 30, 7]
4

6 回答 6

5

您不应并行迭代这两个列表。你需要一个嵌套的 for 循环。像这样的东西:

for elem1 in list1
    for elem2 in list2
        add elem1 to result
        add elem2 to result

只需将伪代码转换为增强的 for 循环或带有迭代器的 while 循环。迭代器的缺点是您需要list2为每个外部循环迭代重新创建迭代器。

于 2013-09-03T14:43:43.027 回答
0

我认为你的交错方法应该是:

List<Integer> result = new ArrayList<Integer>(list2.size()
     + list1.size());
for (int i : list1) {
  for (int j : list2) {
    result.add(i);
    result.add(j);
  }
}
return result;
于 2013-09-03T14:44:33.267 回答
0

我认为你的循环是错误的。

基本上你需要做的。

  1. 对于第一个列表循环中的每个元素。
  2. 对于第二个列表中的每个元素,添加第一个元素,然后添加第二个元素。

IE

for(Integer intval1 : list1)
{
   for(Integer intval2: list2)
   {
      result.add(intval1);
      result.add(intval2);
   } 
}
于 2013-09-03T14:44:57.627 回答
0

将您的交错方法更改为。

我们想要的是:

  • 对于第一个列表中的每个元素,要添加第二个列表中的每个元素

所以我们将这些元素添加到内部 for 循环中

public static List<Integer> interleave(final List<Integer> list1,
            final List<Integer> list2) {
        List<Integer> result = new ArrayList<Integer>();

        for (Integer num : list1) {

            for (Integer num2 : list2) {
                result.add(num);
                result.add(num2);
            }

        }

        return result;
    }

您不需要Iterator为此目的。如上所述使用增强的 for 循环。

不确定它是否符合您的目的,但您的列表也可以有一个键值对。

Map<Integer,List<Integer>> map = new ArrayList<Integer, List<Integer>>();
for(Integer num : list1 ){
    map.put(num,list2);
}

如果你想要一对多的关系,你可以在这里创建键值对

于 2013-09-03T14:46:21.023 回答
0

您可以为此更改循环:

for (int i = 0; i < list1.size(); i++) {

        for (int j = 0; j < list2.size(); j++){
            result.add(list1.get(i));
            result.add(list2.get(j));
        }
    }

谢谢

于 2013-09-03T14:48:36.537 回答
0
    private void listEntryCalc()
    {
        ArrayList<Integer> numbers = new ArrayList<Integer>();
        numbers.add(10);
        numbers.add(20);
        numbers.add(30);
        numbers.add(40);


        ArrayList<Integer> numbers2 = new ArrayList<Integer>();
        numbers2.add(4);
        numbers2.add(5);
        numbers2.add(7);

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

        for (Integer integer : numbers)
        {
            for (Integer integer1 : numbers2)
            {
                finalList.add(integer);
                finalList.add(integer1);
            }
        }

        System.out.println("list " + finalList);
    }

输出是:

[10, 4, 10, 5, 10, 7, 20, 4, 20, 5, 20, 7, 30, 4, 30, 5, 30, 7, 40, 4, 40, 5, 40, 7]
于 2013-09-03T14:49:37.340 回答