Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:有效地比较两个列表的内容,可能包括重复项,忽略顺序,不使用排序_Scala_Sorting - Fatal编程技术网

Scala:有效地比较两个列表的内容,可能包括重复项,忽略顺序,不使用排序

Scala:有效地比较两个列表的内容,可能包括重复项,忽略顺序,不使用排序,scala,sorting,Scala,Sorting,在Scala中,如何有效地比较两个列表/序列的内容,而不考虑它们的顺序,而不进行排序(我不知道元素的类型是什么) 列表/序列可能包含重复项 我看到了,但有些答案不正确,或者需要排序。你可以这样做 list1.groupBy(identity) == list2.groupBy(identity) 是O(n) 如果创建临时列表是一个问题,您可以创建一个帮助器方法,仅获取每个项目的计数,而不是所有事件的计数: def counter[T](l: List[T]) = l.foldLeft(M

在Scala中,如何有效地比较两个列表/序列的内容,而不考虑它们的顺序,而不进行排序(我不知道元素的类型是什么)

列表/序列可能包含重复项

我看到了,但有些答案不正确,或者需要排序。

你可以这样做

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 Maciel
a
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 Maciel
a
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您应该补充一点,您不希望在您的问题中出现这种空间复杂性。事实上,我认为我的解决方案解决了你问题中描述的问题。如果您不希望空间复杂,请使用排序解决方案。你知道,没有免费的午餐。