List 根据字段子集的列表中的唯一元素
有这样的记录吗List 根据字段子集的列表中的唯一元素,list,haskell,duplicates,unique,List,Haskell,Duplicates,Unique,有这样的记录吗 data Foo=Foo{fooName::Text,fooAge::Int,fooCity::Text} 有了这些元素的列表,在这个假设的removeDupBy函数的模型上,是否有一个函数只删除字段子集上的重复项 foos= [ Foo“john”32“伦敦”, Foo“joe”18“纽约”, Foo“john”22“巴黎”, 富“约翰”32“马德里”, Foo“joe”17“洛杉矶”, Foo“joe”18“Berlin” ] >removeDupBy(\(Foo f)->
data Foo=Foo{fooName::Text,fooAge::Int,fooCity::Text}
有了这些元素的列表,在这个假设的removeDupBy
函数的模型上,是否有一个函数只删除字段子集上的重复项
foos=
[
Foo“john”32“伦敦”,
Foo“joe”18“纽约”,
Foo“john”22“巴黎”,
富“约翰”32“马德里”,
Foo“joe”17“洛杉矶”,
Foo“joe”18“Berlin”
]
>removeDupBy(\(Foo f)->(Foo名称,fooAge))foos
[
Foo“john”32“伦敦”,
Foo“joe”18“纽约”,
Foo“john”22“巴黎”,
Foo“joe”17“洛杉矶”
]
我可以实现我自己的,但更喜欢使用一个来自成熟库的库,它可能会更高性能,并且对边缘情况更具弹性。我正在考虑使用nub
,但我不确定如何将实际的Foo
元素映射到nub
将过滤掉的元组(fooName,fooAge)
。您可以使用:
(输出格式化以增强可读性)由于您只处理字符串和数字,因此可以使用
Ord
实例有效地删除重复项,甚至可以使用哈希表
,这样可以实现几乎恒定的时间查找
与所需签名完全匹配的一些功能包括:
如果您需要执行许多这样的操作,您可能更喜欢直接使用
Map
或HashMap
。from。刚刚发现的关于此算法的值是O(n^2),但也可以是O(n log n)如果使用了Ord
或Hashable
实例。@4castle您会将Ord
/Hashable
与nubBy
一起使用,还是需要使用nubOrdOn
?Jivan它必须具有不同的功能,如nubOrdOn
,或者您可以使用映射
//HashMap(插入全部,然后读取值)nubOrdOn
的工作方式就像一个符咒
Prelude Data.List> nubBy (\x y -> (fooName x, fooAge x) == (fooName y, fooAge y)) foos
[Foo {fooName = "john", fooAge = 32, fooCity = "London"},
Foo {fooName = "joe", fooAge = 18, fooCity = "New York"},
Foo {fooName = "john", fooAge = 22, fooCity = "Paris"},
Foo {fooName = "joe", fooAge = 17, fooCity = "Los Angeles"}]
Data.Containers.ListUtils> nubOrdOn (\f -> (fooName f, fooAge f)) foos
Witherable> hashNubOn (\f -> (fooName f, fooAge f)) foos