计算在Array中发生的值

时间:2017-03-23 22:22:32

标签: c# arrays count

我正在努力完成我需要编写的程序。要求是用户输入数组的大小。然后他们输入数组的元素,之后程序需要显示输入的值,然后显示每个值出现的次数。虽然一切似乎都有效但除了它没有正确显示“发生”部分。让我们输入“1 1 2 3 4”(数组大小为5)打印

1 occurs 1 time. 
1 occurs 1 time. 
2 occurs 1 time. 
3 occurs 1 time. 
4 occurs 2 times.  

这是不对的,因为1次发生2次而4次只发生1次。请帮忙......

    static void Main(string[] args)
    {
        int[] arr = new int[30];
        int size,
            count=0,
            count1=0,
            count2=0;

        Console.Write("Enter Size of the Array: ");
        size = Convert.ToInt32(Console.ReadLine());

        Console.Write("Enter the elements of an Array: ");
        for (int i=0; i < size; i++)
        {
            arr[i] = Convert.ToInt32(Console.ReadLine());
       }

        Console.Write("Values Entered: \n");
        for (int i = 0; i < size; i++)
        {
            Console.WriteLine(arr[i]);
            if (arr[i] <= 10)
                count++;
            else
                count1++;
        }

        for(int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                if (arr[i] == arr[j])
                    count2++;
                else
                    count2 = 1;
            }

            Console.WriteLine(arr[i] + " Occurs " + count2 + " Times.");
        }
        Console.WriteLine("The number of valid entries are: " + count + "\nThe number of invalid entries are: " + count1);
        Console.ReadKey();
    }

3 个答案:

答案 0 :(得分:1)

如果你可以使用Linq,这很容易:

Console.Write("Values Entered: \n");

添加

var grouped = arr.GroupBy(x => x);
foreach (var group in grouped)
{
    Console.WriteLine("number {0} occurs {1} times", group.Key, group.Count());
}

修改

由于OP不允许使用Linq,这里是 array-only 解决方案。比字典方法更多的代码,但只有数组。

Console.Write("Values Entered: \n");
//an array to hold numbers that are already processed/counted. Inital length is as same as original array's
int[] doneNumbers = new int[arr.Length];
//counter for processed numbers
int doneCount = 0;
//first loop
foreach (var element in arr)
{
    //flag to skip already processed number 
    bool skip = false;
    //check if current number is already in "done" array
    foreach (int i in doneNumbers)
    {
        //it is!
        if (i == element)
        {
            //set skip flag
            skip = true;
            break;
        }
    }

    //this number is already processed, exit loop to go to next one
    if (skip)
        continue;

    //it hasn't been processed yes, so go through another loop to count occurrences
    int occursCounter = 0;
    foreach (var element2 in arr)
    {
        if (element2 == element)
            occursCounter++;
    }

    //number is processed, add it to "done" list and increase "done" counter
    doneNumbers[doneCount] = element;
    doneCount++;

    Console.WriteLine("number {0} occurs {1} times", element, occursCounter);
}

答案 1 :(得分:0)

您只需使用字典:

    static void Main(string[] args)
    {
        var dic = new Dictionary<int, int>();

        Console.Write("Enter Size of the Array: ");
        int size = Convert.ToInt32(Console.ReadLine());

        Console.Write("Enter the elements of an Array: ");
        for (int i = 0; i < size; i++)
        {
            int val = Convert.ToInt32(Console.ReadLine());

            int current;
            if (dic.TryGetValue(i, out current))
            {
                dic[val] = current + 1;
            }
            else
            {
                dic.Add(val, 1);
            }
        }

        foreach (int key in dic.Keys)
        {
            Console.WriteLine(key + " Occurs " + dic[key] + " Times.");
        }

        Console.Read();
    }

答案 2 :(得分:0)

问题是,只要发现不匹配,您就会将count2重置为1

你应该做的是在外部循环中将count2设置为0(因此它基本上为每个项重置一次),然后让内部循环计算该数字的所有实例:

// For each item 'i' in the array, count how many other items 'j' are the same
for (int i = 0; i < size; i++)
{
    count2 = 0; // processing a new item, so reset count2 to 0

    for (int j = 0; j < size; j++)
    {
        if (arr[i] == arr[j]) count2++;
    }

    Console.WriteLine(arr[i] + " occurs " + count2 + " times.");
}