Scala:有效地比较两个列表的内容,可能包括重复项,忽略顺序,不使用排序
在Scala中,如何有效地比较两个列表/序列的内容,而不考虑它们的顺序,而不进行排序(我不知道元素的类型是什么) 列表/序列可能包含重复项 我看到了,但有些答案不正确,或者需要排序。你可以这样做Scala:有效地比较两个列表的内容,可能包括重复项,忽略顺序,不使用排序,scala,sorting,Scala,Sorting,在Scala中,如何有效地比较两个列表/序列的内容,而不考虑它们的顺序,而不进行排序(我不知道元素的类型是什么) 列表/序列可能包含重复项 我看到了,但有些答案不正确,或者需要排序。你可以这样做 list1.groupBy(identity) == list2.groupBy(identity) 是O(n) 如果创建临时列表是一个问题,您可以创建一个帮助器方法,仅获取每个项目的计数,而不是所有事件的计数: def counter[T](l: List[T]) = l.foldLeft(M
list1.groupBy(identity) == list2.groupBy(identity)
是O(n)
如果创建临时列表是一个问题,您可以创建一个帮助器方法,仅获取每个项目的计数,而不是所有事件的计数:
def counter[T](l: List[T]) =
l.foldLeft(Map[T,Int]() withDefaultValue 0){ (m,x) =>
m + (x -> (1 + m(x)))
}
counter(list1) == counter(list2)
你能行
list1.groupBy(identity) == list2.groupBy(identity)
是O(n)
如果创建临时列表是一个问题,您可以创建一个帮助器方法,仅获取每个项目的计数,而不是所有事件的计数:
def counter[T](l: List[T]) =
l.foldLeft(Map[T,Int]() withDefaultValue 0){ (m,x) =>
m + (x -> (1 + m(x)))
}
counter(list1) == counter(list2)
给定这两个列表,您想要的输出是什么<代码>val a=列表(2,3,1,2)和
val b=列表(3,1,2,3)
?那么valx=List(2,3,1,2)
和valy=List(3,1,2,2)
呢?@Onilton Maciela
和b
是不等价的<代码>a有两个2
和b
没有x
和y
是等价的。那么第二个呢?val x=列表(2,3,1,2)和val y=列表(3,1,2,2)将两者转换为多集(bag),并进行比较。这与Onilton Maciel的答案大致相同,没有那些额外的重复值数组。多集(令人烦恼)不在标准中library@The原型Paul关于在何处找到multiset实现的更多详细信息?给定这两个列表,您想要什么输出<代码>val a=列表(2,3,1,2)和val b=列表(3,1,2,3)
?那么valx=List(2,3,1,2)
和valy=List(3,1,2,2)
呢?@Onilton Maciela
和b
是不等价的<代码>a有两个2
和b
没有x
和y
是等价的。那么第二个呢?val x=列表(2,3,1,2)和val y=列表(3,1,2,2)将两者转换为多集(bag),并进行比较。这与Onilton Maciel的答案大致相同,没有那些额外的重复值数组。多集(令人烦恼)不在标准中library@The原型Paul关于在何处找到multiset实现的更多详细信息?或者:.sortBy(uu.hashCode)
是的,我提供的链接中提到了它。对于n个不同元素的每个列表,它将创建n个列表。这有多有效。@rapt您应该补充一点,您不希望在您的问题中出现这种空间复杂性。事实上,我认为我的解决方案解决了你问题中描述的问题。如果您不希望空间复杂,请使用排序解决方案。你知道,没有免费的午餐。或者:.sortBy(\uu.hashCode)
是的,我提供的链接中提到了。对于n个不同元素的每个列表,它将创建n个列表。这有多有效。@rapt您应该补充一点,您不希望在您的问题中出现这种空间复杂性。事实上,我认为我的解决方案解决了你问题中描述的问题。如果您不希望空间复杂,请使用排序解决方案。你知道,没有免费的午餐。