我做一个函数,找到重复的整数,并将它们作为数组存储和输出数量。 我创建名为“命中”的列表,用于排除重复数字的操作。如果我曾经找到所有重复的数字我不需要再做一次。 但“命中”列表不起作用。它让我超出范围错误。 例如:我有数组int [] in_number = {1,2,2,4,5,6,6}; 没有“命中” 它会给我。我已经做到了。它有效。
0
1 2
1 2
3
4
5 6
5 6
输出
使用“Hit”我尝试做(它不起作用)
0
1 2
3
4
5 6
但我想(最好的方式)
1 2
5 6
这是代码:
namespace arrow
{
class Program
{
static void Main(string[] args)
{
int Min = 0;
int Max = 10;
int[] in_number = new int[100];
Random randNum = new Random();
for (int i = 0; i < in_number.Length; i++)
{
in_number[i] = randNum.Next(Min, Max);
}
duplicate_number_List (in_number);
}
static void dupnumlist (int[] in_number) // Find duplicate numbers
{
List<List<int>> duplicate_pair = new List<List<int>>();
List<int> Hit = new List<int>();
for (int i = 1; i < in_number.Length; i++)
{
List<int> SubList = new List<int>();
foreach (int number in Hit)
{
if (number == in_number[i]) // Will match once
{
i++; // go to next iteration; passing unnecessary
}
}
for (int j = 0; j < in_number.Length; j++)
{
if (in_number[j]==in_number[i])
{
SubList.Add(j);
Hit.Add(in_number[i]);
}
}
duplicate_pair.Add(SubList);
}
foreach (var sublist in duplicate_pair)
{
foreach (var value in sublist)
{
Console.Write(value);
Console.Write(' ');
}
Console.WriteLine();
}
foreach (var value in Hit)
{
Console.Write(value);
Console.Write(' ');
}
Console.WriteLine();
}
}
}
我不想使用内置函数
答案 0 :(得分:1)
听起来你正在寻找这样的东西:
int[] in_number = {1, 2, 2, 4, 5, 6, 6};
var duplicates =
from a in in_number.Select((value, index) => new { value, index })
group a by a.value into g
where g.Count() > 1
select g.First();
第一行选择整数列表中的每个数字以及作为对的索引。第二行将具有相同值的对组合在一起。第三行过滤掉只有一个成员的任何组。最后,最后一行返回每组中的第一对,其中包含值和最低索引。
然后你可以遍历重复项并将它们写出来:
foreach (var dup in duplicates)
{
Console.WriteLine("{0} {1}", dup.index, dup.value);
}
<强>更新强>
如果您可以假设输入数组已经排序,那么这是一个仅使用字典的解决方案:
var previousValue = in_number[0];
var duplicates = new Dictionary<int, int>();
for(int i = 1; i < in_number.Length; i++) // Note: starting at 1 instead of 0
{
if (previousValue == in_number[i] && !duplicates.ContainsKey(i))
{
duplicates.Add(previousValue, i - 1);
}
previousValue = in_number[i];
}
如果输入数组可能没有排序,那么它会有点困难,但你仍然可以用一对Dictionaries来完成:
var first = new Dictionary<int, int>(); // Stores the first instance of each value and its index
var duplicates = new Dictionary<int, int>(); // Stores any subsequent instances with the previous index
for(int i = 0; i < in_number.Length; i++)
{
if (!first.ContainsKey(in_number[i]))
{
first.Add(in_number[i], i);
}
else if (!duplicates.ContainsKey(in_number[i]))
{
duplicates.Add(in_number[i], first[in_number[i]]);
}
}
答案 1 :(得分:0)
为什么不使用HashTable
课程?将值存储在Key
上的Value
和HashTable
属性上,如果它等于上一个条目,则根本不存储它。
请参阅this,我保证这是最简单的方法。