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

标签 java c# data-structures

我正在解决一个问题,该问题利用了 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/

相关文章:

java - Guava 重试器调用函数直到发生异常

c# - ItemTemplate 中的控件无法在代码隐藏中调用

Scala 可变参数函数和 Seq

java通过索引访问hashmap内部数组

c++ - 任何人都可以降低我的代码的复杂性吗? Codeforces Round113 Div.2 的问题 E

java - 自定义Action Bar如何实现?

java - 如何检查字符串是否代表数字以及代表什么类型?

JavaFX - 为什么将节点多次添加到一个 Pane 或添加到不同的 Pane 会导致错误?

c# - 使用 .NET 标准库的 ASP.NET Web 应用程序

c# - 如何使用 LINQ 和 C# 最好地提取属性值和元素值