如何在Dart中合并两个列表?

5
我正在尝试合并两个列表,使输出结果如下:
List<String> array1 = ["John", "Bob", "Fred", "June", "Tom"];
List<String> array2 = ["House", "Flat", "Bungalow"];

List<String> output = //["John", "House", "Bob", "Flat", "Fred", "Bungalow", "June", "Tom"]

我该如何实现这个?我查看了quiver库中的zip函数,但它只返回与传递给它的最短列表一样长的列表。
编辑:为了澄清,我基本上想做与zip函数相同的事情,但如果一个数组比另一个数组长,我只想将剩余的项目附加到末尾。
6个回答

8

我认为这也应该可以工作

void main() {
  var list1 = ["John", "Bob", "Fred", "June", "Tom"];
  var list2 = ["House", "Flat", "Bungalow"];
  var list3 = [...list1, ...list2];

  print(list1);
  print(list2);
  print(list3);
}

输出应该像这样(在DartPad中测试过)。
[John, Bob, Fred, June, Tom]
[House, Flat, Bungalow]
[John, Bob, Fred, June, Tom, House, Flat, Bungalow]

4
这只是将一个列表附加到另一个列表的末尾,这不是提问者要求的。他们想要合并这两个列表。 - Adam Cooper
抱歉?我创建了一个新列表并使用扩展运算符合并了另外两个列表,为什么这不被视为合并呢?另外,最好使用list.addAll(anotherList)来追加一个列表。 - Aly Yasser Pranajaya
2
啊,我的错。我的回答实际上没有回答问题,抱歉。 - Aly Yasser Pranajaya
没问题,很棒你参与并提出了一个答案。不过我建议你重写或删除你的答案,以避免被踩。 - Adam Cooper

4
另一种解决方案如下,可能比Gunter的解决方案效率低一些,但在本质上更具功能性,我喜欢从多个角度解决问题。如果数组像这样短,那么优化连接可能根本不是一个问题。
该解决方案在最长数组的指数上创建可迭代对象,并且对于每个索引i,如果i同时存在于两个数组中,则从输入数组中创建可能有两个条目。否则,它仅包含包含i的数组元素。
import 'dart:math' as math;

main() {
  List<String> array1 = ["John", "Bob", "Fred", "June", "Tom"];
  List<String> array2 = ["House", "Flat", "Bungalow"];

  //["John", "House", "Bob", "Flat", "Fred", "Bungalow", "June", "Tom"]
  List<String> output =
      Iterable.generate(math.max(array1.length, array2.length))
          .expand((i) sync* {
    if (i < array1.length) yield array1[i];
    if (i < array2.length) yield array2[i];
  }).toList();

  print(output);
}

3
我不知道有现成的东西可用,但这个应该可以满足你的需求:
import 'dart:math' as math;

void main() {
  List<String> array1 = ["John", "Bob", "Fred", "June", "Tom"];
  List<String> array2 = ["House", "Flat", "Bungalow"];

  List<String> output = List<String>(array1.length + array2.length);
  int i = 0;
  for (i; i < math.min(array1.length, array2.length); i++) {
    output[i * 2] = array1[i];
    output[i * 2 + 1] = array2[i];
  }
  print(output);
  if (array1.length != array2.length) {
    if (array1.length > array2.length) {
      output.setRange(i * 2, output.length, array1.sublist(i));
    } else {
      output.setRange(i * 2, output.length, array2.sublist(i));
    }
  }
  print(output);
}

谢谢你的回答,但这样不会只是将一个数组附加到另一个数组上吗?我已经更新了问题,希望能添加更多细节。 - Jordan Davies
所以顺序很重要吗?我以为你只是不想要重复的。 - Günter Zöchbauer

2
我怀疑没有一个核心方法可以完全满足您的要求。看看我的merge函数:
最初的回答:我不确定是否有一个恰好符合你要求的核心方法。请查看我的merge函数:
import 'dart:math';

List<String> merge(List<String> a, List<String> b) {
    List<String> output = [];

    var min_length = min(a.length, b.length);
    var max_length = max(a.length, b.length);

    for(var i = 0; i < min_length; i++) {
      output.add(a[i]);
      output.add(b[i]);
    }

    List<String> longer = a.length > b.length ? a : b;

    for(var i = min_length; i < max_length; i++) {
      output.add(longer[i]);
    }

    return output;
  }

void main() {
    merge(
      ["John", "Bob", "Fred", "June", "Tom"],
      ["House", "Flat", "Bungalow"]
    ).forEach((e) => print(e));

    print('------');

    merge(
      ["John", "Bob"],
      ["House", "Flat", "Bungalow"]
    ).forEach((e) => print(e));
}

2

我也找不到解决方法,如果可能的话,我不想使用列表转换或数学函数,所以我写了这个:

extension IterableExtensions<T> on Iterable<T> {
  Iterable<T> merge(Iterable<T> other) sync* {
    
    Iterator<T> iter1 = this.iterator;
    Iterator<T> iter2 = other.iterator;

    bool has1 = iter1.moveNext();
    bool has2 = iter2.moveNext();
    while(has1 && has2) {
      yield iter1.current;
      yield iter2.current;
      has1 = iter1.moveNext();
      has2 = iter2.moveNext();
    }
    while(has1) {
      yield iter1.current;
      has1 = iter1.moveNext();
    }
    while(has2) {
      yield iter2.current;
      has2 = iter2.moveNext();
    }
  }
}

目前它可能需要一些整理,但它能够工作。

这里有示例。


2

你可以使用addAll()方法,如下所示。

List<int> a =[1,2];  List<int> b =[1,2];
List<int> c =[];
c.addAll(a);
c.addAll(b);

或者 insertAll(index,Iterable<>)
List<int> a =[1,2];  
List<int> b =[1,2];
a.insertAll(a.length,b);

   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接