我越来越喜欢dart的列表操作函数。然而,我经常发现自己需要一个“分区”函数,根据布尔标准将列表分成两部分。意思是,与.where
相同,但不会丢弃假的。
明显的实施:
Iterable partition(Iterable list, filter) {
var matches = [];
var nonMatches = [];
list.forEach((e) {
if (filter(e)) {
matches.add(e);
} else {
nonMatches.add(e);
}
});
return [matches, nonMatches];
}
字符串
然而,我也越来越喜欢where
返回的懒惰迭代。
另一种实现是使用集合:
Iterable partition(Iterable list, filter) {
var matches = list.where(filter);
var nonMatches = list.toSet().difference(matches.toSet()).toList();
return [matches, nonMatches];
}
型
我很乐意看到一个优雅的惰性实现是如何完成的(如果它很容易的话)。我相信从列表中构造一个集合是一个O(n)
操作,所以这两个实现在效率上应该不会有太大的差异。
更新set实现有缺陷。我不太明白为什么它不工作,但nonMatches
不包含matches
中不包含的所有数字。
4条答案
按热度按时间ocebsuys1#
怎么样:
字符串
此致罗伯特
wlp8pajw2#
您可以将其无缝地混合到视图中,例如
UnmodifiableListView
:字符串
bjp0bcyl3#
如果你把它概括起来,它会变得更简单
字符串
尽管让它变懒并不容易
kuarbcqp4#
dart 版本:
字符串
配分函数:
型
作为Iterables的扩展:
型
对于两个列表的返回值来说,懒惰是什么意思?这个问题没有太大的意义。原则上,你可以实现一个懒惰计算的Iterable。但是你会返回什么呢?
型
main的输出:
型