使用List查找重复的整数

时间:2013-12-20 03:07:35

标签: c#

我做一个函数,找到重复的整数,并将它们作为数组存储和输出数量。 我创建名为“命中”的列表,用于排除重复数字的操作。如果我曾经找到所有重复的数字我不需要再做一次。 但“命中”列表不起作用。它让我超出范围错误。 例如:我有数组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();
                }              
    }
}

我不想使用内置函数

2 个答案:

答案 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上的ValueHashTable属性上,如果它等于上一个条目,则根本不存储它。

请参阅this,我保证这是最简单的方法。