简体   繁体   English

如何检查我的数组中是否有重复的值?

[英]How do I check if my array has repeated values inside it?

So here is my array.所以这是我的数组。

double[] testArray = new double[10];
// will generate a random numbers from 1-20, too lazy to write the code

I want to make a search loop to check if any values are being repeated.我想做一个搜索循环来检查是否有重复的值。 How do I do that?我怎么做?

I would prefer not to use any special built-in methods since this is a small array.我不想使用任何特殊的内置方法,因为这是一个小数组。

You could do this with a little Linq:你可以用一个小的 Linq 来做到这一点:

if (testArray.Length != testArray.Distinct().Count())
{
    Console.WriteLine("Contains duplicates");
}

The Distinct extension method removes any duplicates, and Count gets the size of the result set. Distinct扩展方法删除任何重复项, Count获取结果集的大小。 If they differ at all, then there are some duplicates in the list.如果它们完全不同,则列表中有一些重复项。

Alternatively, here's more complicated query, but it may be a bit more efficient:或者,这里有更复杂的查询,但它可能更有效:

if (testArray.GroupBy(x => x).Any(g => g.Count() > 1))
{
    Console.WriteLine("Contains duplicates");
}

The GroupBy method will group any identical elements together, and Any return true if any of the groups has more than one element. GroupBy方法将任何相同的元素组合在一起,如果任何组有多个元素,则Any返回true

Both of the above solutions work by utilizing a HashSet<T> , but you can use one directly like this:上述两种解决方案都通过使用HashSet<T> ,但您可以像这样直接使用一个:

if (!testArray.All(new HashSet<double>().Add))
{
    Console.WriteLine("Contains duplicates");
}

Or if you prefer a solution that doesn't rely on Linq at all:或者,如果您更喜欢完全不依赖 Linq 的解决方案:

var hashSet = new HashSet<double>();
foreach(var x in testArray) 
{
    if (!hashSet.Add(x)) 
    {
        Console.WriteLine("Contains duplicates");
        break;
    }
}

take look at my implementation its generic and efficient看看我的实现,它的genericefficient

public static bool HasDuplicates<T>(IList<T> items)
    {
        Dictionary<T, bool> map = new Dictionary<T, bool>();
        for (int i = 0; i < items.Count; i++)
        {
            if (map.ContainsKey(items[i]))
            {
                return true; // has duplicates
            }
            map.Add(items[i], true);
        }
        return false; // no duplicates
    }

here are some calls这里有一些电话

string[] strings = new[] { "1", "2", "3" };
Utility.HasDuplicates(strings)// this will return false

int[] items=new []{1,2,3,1};
Utility.HasDuplicates(items)// this will return true

Use this:用这个:

bool CheckUniqueness(double[] values)
{
    var uniqueValues = new HashSet<double>();
    foreach (double d in values)
    {
        if(uniqueValues.Contains(d))
        {
            return false;
        }
        uniqueValues.Add(d);
    }
    return true;
}

We must initialize j from i on the first loop and add one(i+1) because we want to compare first loop value with the next value of same array.我们必须在第一个循环中从i初始化j并添加一个(i + 1),因为我们想将第一个循环值与同一数组的下一个值进行比较。

int[] arr = new int[]{1,2,3,1,4,2,5,4};

//create one loop for arr values
for (int i = 0;  i < arr.Length; i++)
{
    //create nested loop for compare current values with actual value of arr
    for (int j = i+1; j < arr.Length; j++)
    {

        //and here we put our condition
        if (arr[i] == arr[j])
        {
            Console.WriteLine(arr[i]);
        }
    }
}

With (OP) 10 random doubles quite fast.使用 (OP) 10 随机加倍非常快。 The chance of a repeat: ~0.000002 %.重复的几率:~0.000002 %。

static bool repeat(double[] a)
{
    return
        a[0] == a[1] || a[0] == a[2] || a[0] == a[3] || a[0] == a[4] ||
        a[0] == a[5] || a[0] == a[6] || a[0] == a[7] || a[0] == a[8] ||
        a[0] == a[9] || a[1] == a[2] || a[1] == a[3] || a[1] == a[4] ||
        a[1] == a[5] || a[1] == a[6] || a[1] == a[7] || a[1] == a[8] ||
        a[1] == a[9] || a[2] == a[3] || a[2] == a[4] || a[2] == a[5] ||
        a[2] == a[6] || a[2] == a[7] || a[2] == a[8] || a[2] == a[9] ||
        a[3] == a[4] || a[3] == a[5] || a[3] == a[6] || a[3] == a[7] ||
        a[3] == a[8] || a[3] == a[9] || a[4] == a[5] || a[4] == a[6] ||
        a[4] == a[7] || a[4] == a[8] || a[4] == a[9] || a[5] == a[6] ||
        a[5] == a[7] || a[5] == a[8] || a[5] == a[9] || a[6] == a[7] ||
        a[6] == a[8] || a[6] == a[9] || a[7] == a[8] || a[7] == a[9] ||
        a[8] == a[9];
}

More general, with 10 numbers ~2 times slower than above,更一般的,10个数字比上面慢2倍,
but ~7 times faster than the hashset approach.但比 hashset 方法快 7 倍。

static bool repeat(double[] a)
{
    int k = a.Length - 1;
    if (k < 70)
    {
        double aj;
        for (int i = 0, j; i < k; )
        {
            for (aj = a[k--], j = k; j >= i; j--)
                if (aj == a[j]) return true;
            for (aj = a[i++], j = i; j <= k; j++)
                if (aj == a[j]) return true;
        }
        return false;
    }
    var h = new HashSet<double>();
    while (k >= 0) if (!h.Add(a[k--])) return false;
    return true;
}

Two lines (slow with a repeat ;)两行(慢速重复;)

static bool repeat(double[] a)
{ return (new HashSet<double>(a).Count < a.Length); }

Generic extension method :通用扩展方法:

public static bool HasDuplicate<T>(this IEnumerable<T> source, IEqualityComparer<T> comparer)
{
    if (source == null)
        throw new ArgumentException(nameof(source));

    HashSet<T> set = new HashSet<T>(comparer);
    foreach (var item in source)
        if (!set.Add(item))
            return true;

    return false;
}

use a hashset to add members to, then check if there a previous occurrence of current member使用散列集添加成员,然后检查是否存在当前成员的先前出现

public bool ContainsDuplicate(double[] nums) 
{
            int size = nums.Length;
            HashSet<double> set1 = new HashSet<double>();

            for (int i = 0; i < size; i++)
            {
                if (set1.Contains(nums[i]))
                {
                    return true;
                }
                else
                {
                    set1.Add(nums[i]);
                }
            }
            return false;
}
        int[] nums = new int[] { 1, 2, 3, 4, 5};



        Console.WriteLine(AnyDuplicate(nums));
    }
    /// <summary>
    /// Returns true if there is at least a duplicate in the array.
    /// </summary>
    /// <returns></returns>
    static bool AnyDuplicate(int[] numbers)
    {            
        for (int i = 0; i < numbers.Length; i++)
        {
            for (int j = i + 1; j < numbers.Length; j++)
            {
                if (numbers[i] == numbers[j])
                {
                    return true; 
                }
            }
        }
        return false;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM