Does the collection contain exactly all the elements of other?

The same elements must be present in both self and other, but the order of the elements in the collections are not considered.

assert [1..3].has_exactly([3,1,2]) == true  # the same elements
assert [1..3].has_exactly([3,1])   == false # 2 is not in the array
assert [1..2].has_exactly([3,1,2]) == false

Repeated elements must be present in both collections in the same amount. So basically it is a multi-set comparison.

assert [1,2,3,2].has_exactly([1,2,2,3]) == true  # the same elements
assert [1,2,3,2].has_exactly([1,2,3])   == false # more 2 in the first array
assert [1,2,3].has_exactly([1,2,2,3])   == false

Note that the default implementation is general and correct for any lawful Collections. It is memory-efficient but relies on count so may be CPU-inefficient for some kind of collections.

Property definitions

core $ Collection :: has_exactly
	# Does the collection contain exactly all the elements of `other`?
	#
	# The same elements must be present in both `self` and `other`,
	# but the order of the elements in the collections are not considered.
	#
	#     assert [1..3].has_exactly([3,1,2]) == true  # the same elements
	#     assert [1..3].has_exactly([3,1])   == false # 2 is not in the array
	#     assert [1..2].has_exactly([3,1,2]) == false # 3 is not in the range
	#
	# Repeated elements must be present in both collections in the same amount.
	# So basically it is a multi-set comparison.
	#
	#     assert [1,2,3,2].has_exactly([1,2,2,3]) == true  # the same elements
	#     assert [1,2,3,2].has_exactly([1,2,3])   == false # more 2 in the first array
	#     assert [1,2,3].has_exactly([1,2,2,3])   == false # more 2 in the second array
	#
	# Note that the default implementation is general and correct for any lawful Collections.
	# It is memory-efficient but relies on `count` so may be CPU-inefficient for some kind of collections.
	fun has_exactly(other: Collection[nullable Object]): Bool
	do
		if length != other.length then return false
		for e in self do if self.count(e) != other.count(e) then return false
		return true
	end
lib/core/collection/abstract_collection.nit:162,2--185,4