我有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"
希望我能表明自己的意思。
答案 0 :(得分:0)
我确信可以更高效地完成以下工作,但这是我对如何完成工作的建议。
请注意,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;
}