Как посчитать частоту расслоения числа с помощью c #? - PullRequest
0 голосов
/ 11 марта 2012

Может кто-нибудь помочь мне запустить эту программу, используя c #. Эта программа для расчета частоты числа, например, 12 появляются 10x. Перед этим я пытаюсь отсортировать весь список по горизонтали. Затем я сравниваю то же число, затем считаю ++, но пока не узнаю, что не могу получить вывод.

Спасибо за помощь.

ВХОД

46 31 46 9 25 12 45 33 25 12 12 12 28 36 38 28 25 12 12 9 36 38 36 36 12 9 36 12 12 25 28 34 36 36 9 12 16 25 28 44

OUTPUT

9 - 4 12 -10 16 - 1 25 - 5 28 - 4 31 - 1 33 - 1 34 - 1 36 - 7 38 - 2 44 - 1 45 - 1 46 - 2

Ответы [ 5 ]

4 голосов
/ 11 марта 2012

Ну, вы можете сделать это вручную, используя Dictionary<int, int>:

var frequencies = new Dictionary<int, int>();
foreach (var item in data)
{
    int currentCount;
    // We don't care about the return value here, as if it's false that'll
    // leave currentCount as 0, which is what we want
    frequencies.TryGetValue(item, out currentCount);
    frequencies[item] = currentCount + 1;
}

Более простой, но менее эффективный подход - использовать LINQ:

var frequencies = data.ToLookup(x => x) // Or use GroupBy. Equivalent here...
                      .Select(x => new { Value = x.Key, Count = x.Count() })
                      .ToList();
foreach (var frequency in frequencies)
{
    Console.WriteLine("{0} - {1}", frequency.Value, frequency.Count);
}
2 голосов
/ 11 марта 2012

Если у вас есть список чисел:

var numbers = new List<int>{ 1, 2, 3, 4, 1, 2, 2, 3 };

Тогда мы можем использовать Linq для достижения того, что вы хотите:

var frequencies = 
    numbers.GroupBy( n => n ).Select( n => new { Value=n.Key, Count=n.Count() } );

foreach (var f in frequencies)
{
    Debug.WriteLine(string.Format("Value={0}, Frequency={1}", f.Value, f.Count));
}
1 голос
/ 11 марта 2012

Я бы поместил их все в список, а затем использовал бы группирование по группам, т.е.

        List<int> numbers = new List<int> { 1, 2, 2, 3, 5, 6, 2, 1, 4, 4 };
        foreach (var group in numbers.GroupBy(n => n))
        {
            Console.WriteLine("{0} was found {1} times", group.Key, group.Count());
        }
1 голос
/ 11 марта 2012

Я бы использовал словарь int и int: Dictionary и перебирал числа, добавляя 1 по мере продвижения.некоторые решения используют массив, но я предпочитаю словарь, это устраняет необходимость управлять размером массива и более эффективно использует память.

int[] someValues = { /* your numbers */ }
Dictionary<int,int> Counts = new Dictionary<int,int>();
foreach(int key in someValues)
{
    if ( !Counts.HasKey(key) ) Counts[ key ] = 0;
    Counts[key] = Counts[key] + 1;
}

тогда вы просто перебираете словарь для вывода:

foreach(KeyValuePair<int,int> kvp in Counts)
{
    Console.Write("{0} - {1}",kvp.Key,kvp.Value);
}
0 голосов
/ 11 марта 2012

Домашнее задание?Мы здесь не для того, чтобы выполнять домашние задания, но я дам вам совет о том, что делать.

Во-первых, у меня будет программа для чтения текста, чтобы вы могли ввести ваши данные.Затем проанализируйте каждую запись и добавьте ее в словарь.Затем выполните итерацию по словарю, чтобы узнать, сколько раз встречается конкретная запись.

...