关于Hashset的问题 <int[]>

阿拉德

成员
加入
2月15日,2020年2月15日
消息
16
编程经验
1-3
嘿!
我想知道,使用整个都是真的 hashset. 大批?
或者 hashset. 对象是某些真实的东西,而不是任何阵列!
但是,如果没有逻辑极限
我想知道我是怎么能做的
hashset. 不需要复制一个可重复的数组,我知道在类中继承了 iequatable. 接口并更改等于和 gethashcode. 职能
但是一系列int变量(虽然继承了 int32 结构)与比较有点复杂,我已经尝试了已经从中的各种内置函数技术 hashset. 对象本身,但由于某种原因它没有帮助
比我可以说我构建了一个带有整个数组属性的类,继承了 iequatable. 接口并改变了相等的 gethashcode. 函数(匹配类内容),但它不起作用!
当我暂时创建一维整个数组时,问题更复杂,我通过内置此数组内置的随机类保持随机数,然后将其添加到 hashset.,我注意到了(在 调试器)它不仅将每个其他数组复制到相同的情况 hashset. 对象实际上我真正想要在数组中保持随机数的次数!
这个现象提醒我,基本上是 随机的 内置的C语言功能不仅使用,而且还可以添加一个 时间库 另一个功能 跨越随机,排他性库和额外的随机函数:无随机范围而不改变!
如果有人有解释,我上面提到的一切都很想听到!
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,893
地点
切萨皮克,va.
编程经验
10+
请告诉我们一个无法正常工作的代码的最小示例,并告诉我们您期待看到的内容。

当我暂时创建一维整个数组时,问题更复杂,我通过内置此数组内置的随机类保持随机数,然后将其添加到 hashset.,我注意到了(在 调试器)它不仅将每个其他数组复制到相同的情况 hashset. 目的
这向我暗示了您已经丢失了您的参考文献。我猜你正在做这样的事情:
C#:
var hashSet = new HashSet<int []>();
var random = new Random();
var arr = new int[IntegersToAddCount];
for(int i = 0; i < ArraysToAddCount; i++)
{
    for(int j = 0; j < arr.Length; j++)
        arr[j] = random.Next();
    hashSet.Add(arr);
}

请注意上面的错误,您可以使用相同的数组实例。

正确的事情是始终创建数组的新实例:
C#:
var hashSet = new HashSet<int []>();
var random = new Random();
for(int i = 0; i < ArraysToAddCount; i++)
{
    var arr = new int[IntegersToAddCount];
    for(int j = 0; j < arr.Length; j++)
        arr[j] = random.Next();
    hashSet.Add(arr);
}
 

阿拉德

成员
加入
2月15日,2020年2月15日
消息
16
编程经验
1-3
跳伞运动员

谢谢!代码现在没有问题
谢谢你!
这是我的代码片段
如果你有一个提示让代码更有效,我很乐意听到

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

namespace HashSetOfArrayInt
{
    class Program
    {
        static HashSet<int[]> hashNum = new HashSet<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++;
                    }
                }

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

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

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,893
地点
切萨皮克,va.
编程经验
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);
您不做任何事情来确保数字是唯一的。

我的建议首先将一个值粘在一个值中,然后循环以填充具有唯一值的其余元素。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
这是我的代码片段
发布到论坛时请使用代码标记。谢谢

nd918n6.gif.
 

阿拉德

成员
加入
2月15日,2020年2月15日
消息
16
编程经验
1-3
我忘了提到我做了什么
所以我会解释一下,
这是一个节目,它产生8个数字和由第一索引决定的胜利号码。

您是正确的,该程序的目的不是最逻辑的,但该部分是为了学会与桥接使用的不同类型。该程序的想法是HashSet将在一行中包含一系列编号号,如果在相同的7个数字中再次找到第一个索引中的数字,则相同"Won"!
例如,假设数字是随机绘制的:45,73,23,107,33,278,91和排序后,我们将随机数添加到第一索引(从1到387,而不是代码为210),这是107,然后107号赢了。如果阵列中没有任何号码,那么没有胜利号码!

而我的真正问题在于,在哈希集中,实际上,保存了8个数字,因为他们自己在对象本身再次出现!
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,893
地点
切萨皮克,va.
编程经验
10+
啊。好的。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,893
地点
切萨皮克,va.
编程经验
10+
等待。这仍然没有意义。所以你生成8个唯一数字。然后丢弃8个数字的最低值,并在1到210之间的随机值替换它。如果最低值是获奖号码,你只会覆盖它?
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,893
地点
切萨皮克,va.
编程经验
10+
此外,目前尚不清楚哈希集在这里购买你。如果整数阵列不会能够告诉哈希值,则您可以轻松使用列表,如果碰撞或不碰撞。
 
最佳 底部