"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.putifAbsent
将 callback 作为其参数以避免对其进行评估,除非确实有必要。当 Map
值为 non-nullable.
时,我个人更喜欢使用 ??=
我假设您确实想要增加现有值(如果存在的话)。如果是这样,我会将 map.putIfAbsent(...)
调用替换为:
map[mutual] = (map[mutual] ?? 0) + 1;
另见:
我正在为一个 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.putifAbsent
将 callback 作为其参数以避免对其进行评估,除非确实有必要。当 Map
值为 non-nullable.
??=
我假设您确实想要增加现有值(如果存在的话)。如果是这样,我会将 map.putIfAbsent(...)
调用替换为:
map[mutual] = (map[mutual] ?? 0) + 1;
另见: