Дарт карта из 2 списков для сортировки - PullRequest
0 голосов
/ 24 марта 2020

У меня есть 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" со значениями строки изображения в соответствии с порядком расстояния строки. Результат должен иметь предметы:

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

Надеюсь, я все прояснил.

1 Ответ

0 голосов
/ 24 марта 2020

Я уверен, что следующее может быть сделано более эффективно, но вот мое предложение о том, как это можно сделать.

Обратите внимание, что важно, чтобы distancestring и imagestring имели одинаковую структуру элементов, как ваш пример.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...