"map.getOrDefault" 相当于 Dart

"map.getOrDefault" equivalent in Dart

我正在为一个 flutter 社交媒体应用开发好友推荐算法。在 Dart 方面,我仍然是一个业余爱好者,所以我被困在以下代码行中:

class FriendSuggestionAlgorithm {
  User friendSuggestion(User user) {
    int max = -1;
    User suggestion;

    Map<User, int> map = new HashMap();

    for (User friend in user.friends) {
      for (User mutualFriend in friend.friends) {
        if (mutualFriend.id != user.id && !user.friends.contains(mutualFriend)) {
        map.putIfAbsent(mutualFriend, map.getOrDefault(mutual, 0) + 1);
      }
      }
    }

    for (MapEntry<User, int> mutualFriend in map.entries) {
      if (mutualFriend.value > max) {
        max = mutualFriend.value;
        suggestion = mutualFriend.key;
      }
    }
    return suggestion;
  }
}

map.getOrDefault 有下划线(我知道 Dart 中不存在该方法)。你知道 Dart 中的等价物是什么吗? (PS,我只是将 Java 代码翻译成 Dart。

感谢任何帮助!

你可以这样做:

map.putIfAbsent(mutual, (map.containsKey(mutual) ? map[mutual] : 0) + 1)

也许看看这个以获取更多信息:https://dart.dev/guides/language/language-tour#conditional-expressions

编辑:

此代码应该有效

class FriendSuggestionAlgorithm {
  User? friendSuggestion(User user) {
    int max = -1;
    User? suggestion;

    Map<User, int> map = {};

    for (User friend in user.friends) {
      for (User mutualFriend in friend.friends) {
        if (mutualFriend.id != user.id && !user.friends.contains(mutualFriend)) {
          map.putIfAbsent(mutualFriend, () => (map[mutualFriend] ?? 0) + 1);
        }
      }
    }

    for (MapEntry<User, int> mutualFriend in map.entries) {
      if (mutualFriend.value > max) {
        max = mutualFriend.value;
        suggestion = mutualFriend.key;
      }
    }
    return suggestion;
  }
}

请注意,suggestion 可以为空,因为可能永远不会分配建议。因此 friendSuggestion(user) 可以 return null;

回到你的问题 正确的代码是

map.putIfAbsent(mutualFriend, () => (map[mutualFriend] ?? 0) + 1);

我原来的回答有误,ifAbsent 部分是一个函数。在函数中检索 mutualFriend 的值。如果那是 null 使用 0.

你的代码没有意义。 map.putIfAbsent 仅在密钥不存在时才有效,因此假设的 map.getOrDefault 使用相同密钥的调用将始终 return 默认值。也就是说,您的逻辑将等同于 map.putIfAbsent(mutual, () => 1),如果密钥已经存在则什么也不会发生。

Map.putifAbsentcallback 作为其参数以避免对其进行评估,除非确实有必要。当 Map 值为 non-nullable.

时,我个人更喜欢使用 ??=

我假设您确实想要增加现有值(如果存在的话)。如果是这样,我会将 map.putIfAbsent(...) 调用替换为:

map[mutual] = (map[mutual] ?? 0) + 1;

另见: