关于HashSet的问题<int[]>

埃拉德

会员
已加入
2020年2月15日
留言内容
16
编程经验
1-3
嘿!
我想找出,使用整个 哈希集 数组?
或者 哈希集 对象用于某些真实事物,而不用于任何数组!
但是,如果没有逻辑限制
我想找出我怎么能
哈希集 不需要复制可重复的数组,我知道在类中继承 quaqua 界面并更改等于 GetHashCode 功能
但是一个int变量数组(尽管继承自 int32 相比之下,结构要复杂一些,我已经尝试了各种内置函数技术 哈希集 对象本身,但由于某种原因它没有帮助
不仅如此,我还可以说我建立了一个具有整个array属性的类,并继承了 quaqua 界面并更改了Equal和 GetHashCode 函数(与课程内容匹配),但没有用!
问题是更复杂的,当我临时创建一维整个数组,并通过该数组中内置的随机类保留随机数,然后将其添加到 哈希集,我注意到(在 调试器)不仅将所有其他数组复制到相同的数组 哈希集 对象实际上,我真正想要在数组中保留随机数的次数!
这种现象基本上使我想起了 随机 使用C语言构建的函数,不仅可以使用,而且确实可以添加 时间图书馆 还有另一个功能 跨度随机,时间库独有的功能和额外的随机功能:不改变范围的随机范围!
如果有人有解释,我上面提到的所有内容都希望听到!
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
请向我们展示一个不起作用的代码的最小示例,并告诉我们您期望看到的内容。

问题是更复杂的,当我临时创建一维整个数组,并通过该数组中内置的随机类保留随机数,然后将其添加到 哈希集,我注意到(在 调试器)不仅将所有其他数组复制到相同的数组 哈希集 目的
这向我暗示您已失去对参考文献的追踪。我猜你正在做这样的事情:
C#:
var hashSet = new 哈希集<int []>();
var 随机 = new Random();
var arr = new int[IntegersToAddCount];
for(int i = 0; i < 数组sToAddCount; i++)
{
    for(int j = 0; j < arr.Length; j++)
        arr[j] = 随机.Next();
    hashSet.Add(arr);
}

请注意上面的错误,其中您正在重新使用数组的相同实例。

正确的做法是始终创建数组的新实例:
C#:
var hashSet = new 哈希集<int []>();
var 随机 = new Random();
for(int i = 0; i < 数组sToAddCount; i++)
{
    var arr = new int[IntegersToAddCount];
    for(int j = 0; j < arr.Length; j++)
        arr[j] = 随机.Next();
    hashSet.Add(arr);
}
 

埃拉德

会员
已加入
2020年2月15日
留言内容
16
编程经验
1-3
跳伞

谢谢!该代码现在运行良好,没有问题
谢谢你!
这是我的代码片段
如果您有使代码更有效的技巧,我很想听听

C#:
using System.IO;
using System.Linq;
using System.Text;

namespace 哈希集OfArrayInt
{
    class Program
    {
        static 哈希集<int[]> hashNum = new 哈希集<int[]>();
        const int SIZE = 900000;

        static void Main(string[] args)
        {
            AddPattrenOfNum();
        }

        static void AddPattrenOfNum()
        {
            var rand = new Random();

            for (int i = 0; i < SIZE; i++)
            {
                var arrTemp = new int[8];

                for (int j = 0; j < arrTemp.Length-1)
                {
                    int num = rand.Next(1, 387);
                    if(!arrTemp.Contains(num))
                    {
                        arrTemp[j] = num;
                        j++;
                    }
                }

                数组.Sort(arrTemp);
                arrTemp[0] = rand.Next(1, 210);

                hashNum .Add(arrTemp);
            }
        }
    }
}
 
由主持人最后编辑:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
因此,在此循环中,您尝试确保有唯一的数字:
C#:
for (int j = 0; j < arrTemp.Length-1)
{
    int num = rand.Next(1, 387);
    if(!arrTemp.Contains(num))
    {
        arrTemp[j] = num;
        j++;
    }
}
但是然后当您进行排序后,替换数组的第一个元素:
C#:
arrTemp[0] = rand.Next(1, 210);
您无需做任何事情来确保该号码是唯一的。

我的建议是先在第一个元素中插入一个值,然后循环使用唯一值填充其余元素。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
这是我的代码片段
发布到论坛时,请使用代码标签。谢谢

nD918n6.gif
 

埃拉德

会员
已加入
2020年2月15日
留言内容
16
编程经验
1-3
我忘了说我做什么
所以我会解释,
这是一个产生8个数字和第一个索引确定的中奖号码的程序。

没错,程序的用途不是最合逻辑的,但部分是要学会与HashSet一起使用,即使是不同的类型。该程序的思想是,HashSet将在一行中包含一系列带编号的数字,并且如果在第一个索引中的数字又在与数字相同的7个数字的同一集合中再次发现"Won"!
例如,假设数字是随机绘制的:45,73,23,107,33,278,91,排序后,我们向第一个索引(从1到387,而不是代码中指定的210)添加一个随机数,即107,然后107号如果数组中根本没有数字,那么就没有中奖号码!

我真正的问题是,实际上,在HashSet中保存了8个数字,它们又再次出现在对象本身中!
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
等待。那仍然没有道理。因此,您生成8个唯一数字。然后,您丢弃这8个数字中的最低值,并用1到210之间的一个随机值替换它。如果最低值是获胜数字,但您只是改写了该数字,该怎么办?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
另外,还不清楚HashSet在这里买了什么。您将同样容易地使用List,因为整数数组将无法告诉哈希集是否存在冲突。
 
最佳 底部