gpt4 book ai didi

java - HashSet> 在 Java 中不允许重复,但在 C# 中允许

转载 作者:行者123 更新时间:2023-12-01 17:41:21 24 4
gpt4 key购买 nike

我正在解决一个问题,该问题利用了 HashSet 不允许重复值的事实。为此,Java 中的解决方案计算多个 HashSet<int>并将它们添加到 HashSet<HashSet<int>>最后返回尺寸。这样它就可以获得 HashSet 的所有不同组合。当我尝试在 C# 中执行此操作时,我没有得到不同的 HashSet。我调试了一下,可以看到两个具有相同值的HashSet。正如下面的屏幕截图所示。

enter image description here

那么有没有一种方法可以在 C# 中获得相同的行为,可能通过使用我自己的比较器,或者如果没有它可能会更好。我尝试创建自己的比较方法,但 HashSet 没有索引,因此不确定如何比较两个 HashSet。或者说这在 C# 中是不可能的。我注意到的一件事是在 Java 中初始化如下:

Set shapes = new HashSet<HashSet<Integer>>();
Set shape = new HashSet<Integer>();

由于 C# 中没有 Set,我的初始化是:

HashSet<HashSet<int>> shapes = new HashSet<HashSet<int>>();
HashSet<int> shape = new HashSet<int>();

不确定这是否会产生影响。

最佳答案

最简单的方法是制作自己的EqualityComparer,尽管它可能不是最有效的方法

示例

public class MyComparer : IEqualityComparer<HashSet<int>>
{
public bool Equals(HashSet<int> x, HashSet<int> y)
=> x?.SetEquals(y) ?? false;

public int GetHashCode(HashSet<int> obj)
{
unchecked
{
return obj.Aggregate(17, (current, item) => current * 31 + item.GetHashCode());
}
}
}

使用

var rand = new Random();

var hashes = Enumerable.Range(0, 20)
.Select(x => new HashSet<int>(Enumerable.Range(0, 3)
.Select(y => rand.Next(0, 5))));


var hashList = new HashSet<HashSet<int>>(hashes, new MyComparer()) ;

foreach (var list in hashList)
Console.WriteLine(string.Join(", ",list));

输出

2, 0
3, 1
0, 1, 4
0, 2, 1
0, 3
4, 0, 3
4, 3
0, 1
1, 2
4, 3, 1
2, 1, 0
2
3, 1, 4
3, 2
4, 1, 3
0, 2
1, 4
1, 3

Full Demo here

关于java - HashSet<HashSet<int>> 在 Java 中不允许重复,但在 C# 中允许,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60733086/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com