【问题标题】:Get most popular value in a list获取列表中最受欢迎的值
【发布时间】:2020-03-17 11:23:19
【问题描述】:

如何在不使用任何第三方库的情况下从 dart 列表中获取最受欢迎的号码?

var list = [0, 1, 1, 2, 2, 2, 3, 3, 4]; // most popular number is 2

如果有两个或多个流行数字,则输出应该是一个包含两个值的列表。示例:

一个热门号码:

var list = [0, 1, 1, 2, 2, 2, 3, 3, 4];
// Output should be [2]

两个或更多热门号码:

var list = [0, 1, 1, 2, 2, 2, 3, 3, 3];
// Output should be [2, 3]

提前感谢您的帮助!

【问题讨论】:

  • 好点!那么最好提供一个热门号码列表。我将编辑我的问题。谢谢!
  • 创建一个地图并使用数字作为键,列表中没有出现次数作为值。然后从那里获得最大值。
  • 这个对我有用:https://stackoverflow.com/a/60732984/12466337 试试看:D

标签: flutter dart


【解决方案1】:

这行得通……你可以优化它

  var list = [1, 1, 2, 2, 3, 4, 5];
  list.sort();
  var popularNumbers = [];
  List<Map<dynamic, dynamic>> data = [];
  var maxOccurrence = 0;

  var i = 0;
  while (i < list.length) {
    var number = list[i];
    var occurrence = 1;
    for (int j = 0; j < list.length; j++) {
      if (j == i) {
        continue;
      }
      else if (number == list[j]) {
        occurrence++;
      }
    }
    list.removeWhere((it) => it == number);
    data.add({number: occurrence});
    if (maxOccurrence < occurrence) {
      maxOccurrence = occurrence;
    }
  }

  data.forEach((map) {
    if (map[map.keys.toList()[0]] == maxOccurrence) {
      popularNumbers.add(map.keys.toList()[0]);
    }
  });

  print(popularNumbers);

【讨论】:

  • 谢谢!这个解决方案完全符合我的期望。仅包含最受欢迎号码的列表。
  • 谢谢,效果很好!
【解决方案2】:

我想我找到了解决方案。

让我给你解释一下:

我已经通过您的列表进行了查询,并检查了地图的键是否包含该元素。如果地图不包含元素作为键,那么它将从元素创建一个键并传递 1 作为值。如果地图确实包含元素作为键,那么它将简单地增加值。

地图准备好后,我对地图值进行了排序并将它们存储在一个列表中。从排序后的地图值中,我从排序值列表中取出最后一个元素,因为我们已按升序对其进行排序,因此最受欢迎的值将排在最后。

最后,我通过映射查询并检查特定键的值是否等于popularValue。如果是,那么我们将当前键和值添加到mostPopularValues 列表中。

如果我有什么问题,请告诉我。

 void main() {
  List list = [0, 1, 1, 1, 2, 2, 2, 3, 3, 4];

  List mostPopularValues = [];

  var map = Map();

  list.forEach((element) {
    if (!map.containsKey(element)) {
      map[element] = 1;
    } else {
      map[element] += 1;
    }
  });

  print(map);
  // o/p : {0: 1, 1: 3, 2: 3, 3: 2, 4: 1}

  List sortedValues = map.values.toList()..sort();

  print(sortedValues);
  // o/p : [1, 1, 2, 3, 3]

  int popularValue = sortedValues.last;

  print(popularValue);
  // o/p : 3

  map.forEach((k, v) {
    if (v == popularValue) {
      mostPopularValues.add("$k occurs $v time in the list");
    }
  });

  print(mostPopularValues);
  // o/p : [1 occurs 3 time in the list, 2 occurs 3 time in the list]
}

【讨论】:

  • 感谢您的回答,我用列表中的字符串替换了数字,这似乎不起作用。该错误表明必须提供非空字符串。
  • @VegetaSaiyan 你能帮我写代码吗?
  • 感谢您的回复,我希望您能再获得10分所以我问了一个qtn @stackoverflow.com/questions/67752313/…
【解决方案3】:

试试这个来计算列表中的每个元素:

var list = [0, 1, 1, 2, 2, 2, 3, 3, 4];
  var popular = Map();

  list.forEach((l) {
    if(!popular.containsKey(l)) {
      popular[l] = 1;
    } else {
      popular[l] +=1;
    }
  });

【讨论】:

  • 非常创新只是一个提示...这是避免使用 'l'(small L) 或 'I'(capital i) 作为变量名的好习惯,尤其是在使用 '1' 时在同一个街区。 ;-)
【解决方案4】:

不确定这是否是最佳解决方案,但效果很好。如果有任何疑问,请告诉我。

    final list = [0, 1, 1, 2, 2, 2, 3, 3, 4];

    // Count occurrences of each item
    final folded = list.fold({}, (acc, curr) {
      acc[curr] = (acc[curr] ?? 0) + 1;
      return acc;
    }) as Map<dynamic, dynamic>;

    // Sort the keys (your values) by its occurrences
    final sortedKeys = folded.keys
        .toList()
        ..sort((a, b) => folded[b].compareTo(folded[a]));

    print('Most popular value: ${sortedKeys.first}'); // 1
    print('Second most popular value: ${sortedKeys[1]}'); // 2

【讨论】:

  • 感谢您的回答,我用列表中的字符串替换了数字,这似乎不起作用。该错误表明必须提供非空字符串。
【解决方案5】:

我已经通过在Iterable 上定义扩展解决了这个问题:

extension MostPopularItemsExtension<E> on Iterable<E> {
  /// Returns the most popular items, where all items in the returned
  /// list have the same number of occurances. If [this] is empty, returns an
  /// empty list
  ///
  /// Examples:
  ///   `[1,2,3,2].mostPopularItems() == [2]`
  ///   `[1,1,2,2].mostPopularItems() == [1,2]`
  Iterable<E> mostPopularItems() {
    if (isEmpty) return [];
    final itemsCounted = <E, int>{};
    for (final e in this) {
      if (itemsCounted.containsKey(e)) {
        itemsCounted[e] = itemsCounted[e]! + 1;
      } else {
        itemsCounted[e] = 1;
      }
    }
    final highestCount = (itemsCounted.values.toList()..sort()).last;
    return itemsCounted.entries
        .where((e) => e.value == highestCount)
        .map((e) => e.key);
  }
}

基本思想是计算 Map 对象中每个项目的所有出现次数,从该映射中获取最高计数,然后返回具有特定出现次数的所有项目。

【讨论】:

    猜你喜欢
    • 2021-10-18
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2021-07-02
    相关资源
    最近更新 更多