一对多类型的arraylist

时间:2013-09-03 14:37:48

标签: java arraylist

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

我被困在我所拥有的场景中:

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]

6 个答案:

答案 0 :(得分:5)

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

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

只需将伪代码转换为增强型for循环或使用迭代器转换为while循环。使用迭代器回退是需要为每个外部循环迭代重新创建list2的迭代器。

答案 1 :(得分: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;

答案 2 :(得分:0)

我认为你的循环错误。

基本上你需要做什么。

  1. 对于第一个列表循环中的每个元素。
  2. 对于第二个列表中的每个元素,添加第一个元素,然后添加第二个元素。
  3. for(Integer intval1 : list1)
    {
       for(Integer intval2: list2)
       {
          result.add(intval1);
          result.add(intval2);
       } 
    }
    

答案 3 :(得分: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);
}

如果您需要一对多关系

,可以在此处创建键值对

答案 4 :(得分: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));
        }
    }

由于

答案 5 :(得分: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]