2个列表的飞镖图进行排序

时间:2020-03-24 11:47:43

标签: list dart mapping

我有2个列表: distancestring [1] [3],具有以下值:

distancestring[0][0]=3.4
distancestring[0][1]=2
distancestring[0][2]=1.1
distancestring[1][0]=5
distancestring[1][1]=4.2

和imagestring [1] [3],具有以下值:

imagestring[0][0]="ccc"
imagestring[0][1]="aaa"
imagestring[0][2]="ddd"
imagestring[1][0]="bbb"
imagestring[1][1]="eee"

我想根据距离字符串的顺序设置第三个列表“结果”,其中包含图像字符串的值。 结果应包含以下项目:

result[0][0]="ddd"
result[0][1]="aaa"
result[0][2]="ccc"
result[1][0]="eee"
result[1][1]="bbb"

希望我能表明自己的意思。

1 个答案:

答案 0 :(得分:0)

我确信可以更高效地完成以下工作,但这是我对如何完成工作的建议。

请注意,distancestringimagestring的元素结构必须与示例相同,这一点很重要。

void main() {
  final distancestring = [
    [3.4, 2, 1.1],
    [5, 4.2]
  ];

  final imagestring = [
    ['ccc', 'aaa', 'ddd'],
    ['bbb', 'eee']
  ];

  print(distancestring); // [[3.4, 2, 1.1], [5, 4.2]]
  print(imagestring); // [[ccc, aaa, ddd], [bbb, eee]]
  print(sort(
      distancestring,
      imagestring,
      (dynamic d1, dynamic d2) =>
          d1.compareTo(d2) as int)); // [[ddd, aaa, ccc], [eee, bbb]]
}

class Pair<A, B> {
  final A a;
  final B b;

  const Pair(this.a, this.b);
}

List<List<B>> sort<A, B>(List<List<A>> distancestring,
    List<List<B>> imagestring, int Function(A, A) compare) {
  final temp = <Pair<A, B>>[];

  for (var i = 0; i < distancestring.length; i++) {
    for (var k = 0; k < distancestring[i].length; k++) {
      temp.add(Pair(distancestring[i][k], imagestring[i][k]));
    }
  }

  temp.sort((e1, e2) => compare(e1.a, e2.a));

  var count = 0;
  final result = <List<B>>[];

  for (var i = 0; i < distancestring.length; i++) {
    final list = <B>[];

    for (var k = 0; k < distancestring[i].length; k++) {
      list.add(temp[count++].b);
    }

    result.add(list);
  }

  return result;
}