我已经在网站上检查了答案,但我很好奇我通过C#编写代码以检查数组中的重复项。我的功能有点像。但最后,当我打印出我的5组数组时,检测到重复项,但输出仍然包含重复项。我还注释了如果检测到重复的部分生成一个随机数来替换在该数组元素中找到的副本。我的逻辑似乎是合理的,一个嵌套的for循环,从第一个元素开始,然后循环遍历同一个数组5次,看看初始元素是否匹配。所以从元素0开始,然后循环5次,看看0到4是否匹配元素0,然后是1,依此类推。另外,当找到重复项时生成一个随机数,并且替换该元素的效果不是很好。我确实看到了使用字典对象及其密钥的解决方案,但我不想这样做,我想只使用原始代码来解决这个算法,没有特殊对象。
我的功能:
void checkForDuplicates()
{
int[] test = { 3,6,8,10,2,3 };
int count = 0;
Random ranDuplicateChange;
for(int i = 0; i < test.Length; i++)
{
count = 0;
Console.WriteLine(" {0} :: The current number is: {1} ",i, test[i]);
for(int j = 0; j < test.Length; j++)
{
if (test[i] == test[j])
{
count++;
if (count >= 2)
{
Console.WriteLine("Duplicate found: {0}", test[j]);
//ranDuplicateChange = new Random();
//test[j] = ranDuplicateChange.Next(1, 72);
}
}
}
}
答案 0 :(得分:2)
你可以使用lambda表达式来获取它们:
var duplicates = test.GroupBy(a => a)
.Where(g => g.Count() > 1)
.Select(i => new { Number = i.Key, Count = i.Count()});
这将返回具有2个属性的匿名类型的 IEnumerable , Number 和 Count
答案 1 :(得分:2)
我想用原始代码来解决这个算法,没有特殊的对象。
我相信你的意思是不使用LINQ或任何其他可以轻松实现最终目标的库方法,而只是操作你拥有的数组并找到一种方法来查找重复项。
让我们暂时搁置代码,看看我们需要做些什么才能找到重复的代码。您的方法是从头开始,并将每个元素与数组中的其他元素进行比较,看看它们是否重复。这不是一个坏主意,所以让我们看看我们需要做些什么来实现它。
你的阵列:
test = 3,6,8,10,2,3
我们必须做的是,取3,看它是否等于下一个元素,然后是下一个元素,然后是下一个元素,直到数组结束。如果发现重复,请替换它们。 第二轮,取6,因为我们已经比较了第一个元素3,我们从8开始并继续直到数组结束。 第三轮,从8开始,然后继续。 你得到漂移。
现在让我们来看看您的代码。
现在我们从零元素开始(为方便起见,我使用基于零的索引),这是3,然后在j
的内循环中,我们看到下一个元素6,是重复的。它不是,所以我们继续前进。等等。我们确实在最后一个位置找到了副本,然后计算它。到目前为止一切都很好。
下一个循环,现在这里是你的第一个错误。您的第二个循环j
从0
开始,因此当i=1
时,j
的第一次迭代从0
开始,因此您需要比较你在第一轮比较的test[1] vs test[0]
(你的外环)。你应该做的是,比较test[1] vs test[2]
。
因此,请根据循环中的i
和j
,考虑您需要在代码中进行哪些更改才能实现此目的。您要做的是,开始j
循环比当前i
值多一个。
接下来,只要找到重复内容,就会增加count
,这很好。但只有在count >= 2
没有意义时才打印该号码。因为,您是在0
开始的,并且只有在找到重复内容时才会增加,因此,即使您的counter
为1
,也就是说您发现了重复内容。您应该简单地生成一个随机数,并用它替换test[j]
。
我故意不给你代码样本,因为你说你渴望自己学习如何解决这个问题,这总是一件好事。希望以上信息有用。
<强> 声明: 强>
上述所有内容只是为了向您展示如何修复当前代码,但它本身仍有缺陷。为了与您同在,您可以用随机数代替&#39;想法不是不漏水的。例如,如果它生成了相同的数字,那么您正在尝试替换(虽然赔率很低,但可以发生,而且当您编写程序时,您不应该依赖机会你的程序没有出错),你仍然最终得到重复。如果它生成了稍后在列表开头找到的数字,则相同。例如,您的列表是2, 3, 5, 3
。 i
的第一次迭代将正确地确定2
不重复。然后在下一次迭代中,您发现3
是重复的,并替换它。但是,如果新的随机生成的数字是2
,并且由于我们已经排除了2
不重复,新生成的2
将会不要再被覆盖,你最终得到一个重复的列表。为了解决这个问题,您可以恢复原来的想法,即每次都使用j
启动0
循环,并在遇到重复时替换。要做到这一点,您需要一个额外的条件来查看i == j
是否如此,以及是否跳过内循环。但即使这样,现在新生成的随机数也可能等于列表中的一个数字再次破坏了你的逻辑。
所以真的,以这种方式尝试这个问题很好,但你也应该每次生成一个数字时将你的随机数与你的列表进行比较,如果是的话相等,然后生成另一个随机数,依此类推,直到你恢复正常为止。
但是在一天结束时,为了删除列表的重复项并用唯一的数字替换它们,使用LINQ等方法会更简单,更容易出错。