Counting the number of times a value appears in an array

前端 未结 4 1737
名媛妹妹
名媛妹妹 2020-12-18 16:27

So what\'s a good, simple algorithm to create a loop in C# where every time a certain value appears in an array it adds 1 to a counter in another array?

For example

相关标签:
4条回答
  • 2020-12-18 16:50

    your count array has 4 fields ...

    one with the index 0, 1, 2 and 3

    so what will happen if a number like 4 (or greater) happens to be counted? yor code tries to access index 4 ... which does not exist ...

    0 讨论(0)
  • 2020-12-18 16:51

    Use LINQ to do the work

    using System.Linq;
    
    var numQuery =
            from num in numbers
            where num == 5
            select num;
    
    Console.WriteLine("Count of 5: " + numQuery.Count);
    

    Or use the method syntax

    var numQuery = numbers.Where(num => num == 5);
    Console.WriteLine("Count of 5: " + numQuery.Count);
    

    See here for the overview and here for query vs method-syntax.
    Found a sample for GroupBy, look here.

    0 讨论(0)
  • 2020-12-18 16:59

    I used Regex for my solution since I only had three values.

    String results = "" + one.ToString() + " " + two.ToString() + " " + three.ToString();
    int count1 = Regex.Matches(results, @one.ToString()).Count;
    int count2 = Regex.Matches(results, @two.ToString()).Count;
    int count3 = Regex.Matches(results, @three.ToString()).Count;
    

    Seems 'hacky', but worked for me. It'll work with strings or numbers but only if you're working with a few values. Pretty efficient in that case. If not, I think the other answer would be a better option.

    0 讨论(0)
  • 2020-12-18 17:02

    You're getting an index out of bounds error because of this section:

    for (i = 0; i < SIZE - 1; i++)
    {
        if (numbers[i] > 0 && numbers[i] < SIZE)
        {
            x = Count[i];
    

    Notice that you're iterating through 0 to SIZE - 1 (11) when Count only has a size of 4.


    You can do this task pretty easily with LINQ though.

    int[] numbers = new int[SIZE] { 5, 5, 5, 7, 7, 7, 9, 7, 9, 9, 9, 1 };
    
    var count = numbers
        .GroupBy(e => e)
        .Where(e => e.Count() == 4)
        .Select(e => e.First());
    

    So it groups the numbers by their value, we then refine the list to only include groups of 4, then select the first of each to be left with a collection of ints.


    Here is a non-LINQ based solution using a Dictionary to store the count of numbers.

    int[] numbers = new int[SIZE] { 5, 5, 5, 7, 7, 7, 9, 7, 9, 9, 9, 1 };
    var dictionary = new Dictionary<int, int>();
    var numbersWithFour = new List<int>();
    
    foreach (var number in numbers)
    {
        if (dictionary.ContainsKey(number))
            dictionary[number]++;
        else
            dictionary.Add(number, 1);
    }
    
    foreach (var val in dictionary)
    {
        if (val.Value == 4)
        {
            numbersWithFour.Add(val.Key);
        }
    }
    

    With a little modification to your program you can get some results.

    int[] numbers = new int[SIZE] { 5, 5, 5, 7, 7, 7, 9, 7, 9, 9, 9, 1 };
    string[] letters = new string[SIZE] { "m", "m", "s", "m", "s", "s", "s", "m", "s", "s", "s", "s" };
    int[] values = new int[SIZE] { 15, 22, 67, 45, 12, 21, 24, 51, 90, 60, 50, 44 };
    string[] status = new string[SIZE] { "f", "m", "f", "a", "m", "f", "f", "f", "m", "f", "m", "f" };
    
    // Set the size of Count to maximum value in numbers + 1
    int[] Count = new int[9 + 1];
    int x = 0;
    int i = 0;
    
    for (i = 0; i < SIZE - 1; i++)
    {
        if (numbers[i] > 0 && numbers[i] < SIZE)
        {
            // Use value from numbers as the index for Count and increment the count
            Count[numbers[i]]++;
        }
    }
    
    for (i = 0; i < Count.Length; i++)
    {
        // Check all values in Count, printing the ones where the count is 4
        if (Count[i] == 4)
            Console.WriteLine("{0}", i);
    }
    

    Output:

    7
    9
    
    0 讨论(0)
提交回复
热议问题