飞镖图排序-基于列表值

时间:2020-05-05 06:34:23

标签: dart

排序键为字符串,值为整数列表的Map的最佳方法是什么。

var userVotes = {
  "arbourn": [1, 0, 7],
  "burun": [2, 9, 0, 1],
  "niko": [1, 0, 3, 10],
};

基于列表(值)进行排序。 1.先赢更高的名单 2.如果值相同,则以长度较大的列表为准。 3.否则,地图没有变化(不是很重要) 预期输出为

var userVotes = {
  "burun": [2, 9, 0, 1],
  "arbourn": [1, 0, 7],
  "niko": [1, 0, 3, 10],
};

性能标准-列表的长度限制为<= 100,键的数量限制为<= 1000。

谢谢!

1 个答案:

答案 0 :(得分:3)

可以执行以下操作:

import 'dart:collection';

void main() {
  final userVotes = {
    "arbourn": [1, 0, 7],
    "burun": [2, 9, 0, 1],
    "niko": [1, 0, 3, 10],
    "niko2": [1, 0, 3, 10, 0],
  };

  final sortedMap =
      LinkedHashMap.fromEntries(userVotes.entries.toList()..sort(sortMethod));

  sortedMap.forEach((key, value) => print('$key: $value'));
}

int sortMethod(MapEntry<String, List<int>> e1, MapEntry<String, List<int>> e2) {
  final l1 = e1.value;
  final l2 = e2.value;
  final minLength = l1.length > l2.length ? l2.length : l1.length;

  for (var i = 0; i < minLength; i++) {
    if (l1[i] > l2[i]) {
      return -1;
    } else if (l1[i] < l2[i]) {
      return 1;
    }
  }

  return l2.length.compareTo(l1.length);
}

哪个输出:

burun: [2, 9, 0, 1]
arbourn: [1, 0, 7]
niko2: [1, 0, 3, 10, 0]
niko: [1, 0, 3, 10]

编辑

由于对映射进行排序实际上并不是那么好,因此更好的策略是将每个键值对转换为将UserVote实现为其他compareTo对象的UserVote对象。可以将这些对象放入列表中并进行排序。

import 'dart:collection';

class UserVote implements Comparable<UserVote> {
  final String name;
  final List<int> list;

  const UserVote(this.name, this.list);

  @override
  int compareTo(UserVote o) {
    final minLength = list.length > o.list.length ? o.list.length : list.length;

    for (var i = 0; i < minLength; i++) {
      if (list[i] > o.list[i]) {
        return -1;
      } else if (list[i] < o.list[i]) {
        return 1;
      }
    }

    return o.list.length.compareTo(list.length);
  }

  @override
  String toString() => '$name: $list';
}

void main() {
  final userVotes = {
    "arbourn": [1, 0, 7],
    "burun": [2, 9, 0, 1],
    "niko": [1, 0, 3, 10],
    "niko2": [1, 0, 3, 10, 0],
  };

  final listOfUserVotes =
      userVotes.entries.map((e) => UserVote(e.key, e.value)).toList();

  listOfUserVotes.sort();
  listOfUserVotes.forEach(print);
}