Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/169: Рейтинг темы: голосов - 169, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 16.09.2014
Сообщений: 5

Как подсчитать количество одинаковых значений в массиве?

16.09.2014, 12:11. Показов 35766. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется большой отсортированный массив в котором нет уникальных значений.Необходимо подсчитать количество всех одинаковых элементов например:
C#
1
 int[] a={1,1,1,1,2,2,2,3,3}
нужно подсчитать каждое вхождение символов 1-4, 2-3 и т.д и записать количество цветов в массив или список,не важно.
Пугает то что массив большой, неизвестно сколько он будет считать пусть даже и отсортированный массив.
Хотел использовать LINQ, но препод забраковал сей вариант
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.09.2014, 12:11
Ответы с готовыми решениями:

Подсчитать количество уникальных значений в массиве
есть список, в нем надо подсчитать количество повторяющихся значений. То есть например : 4, 5, 4, 1, 3, 2 В результате: 4 - 2...

Подсчитать количество одинаковых слов в строке
C# Подсчитать кол-во одинаковых слов в строке (строка вводится с клавиатуры).

Подсчитать наибольшее количество одинаковых букв, идущих подряд
Во введенной строке подсчитать наибольшее количество одинаковых букв, идущих подряд. Напишите, пожалуйста, наиболее короткий код.

23
484 / 439 / 123
Регистрация: 05.01.2010
Сообщений: 1,848
16.09.2014, 12:16
Цитата Сообщение от velzevyl Посмотреть сообщение
массив в котором нет уникальных значений
Цитата Сообщение от velzevyl Посмотреть сообщение
подсчитать количество всех одинаковых элементов
чего-то я не понимаю...
ну и собственно, что надо подсчитать, не совсем понятно
1
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
16.09.2014, 12:34
Если массив точно упорядоченный, то вот:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int[] a = { 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 6, 7, 7, 7, 7, 8};
Dictionary<int, int> Count = new Dictionary<int, int>();
for (int i = 0; i < a.Length; i++)
{
    for (int j = i; j < a.Length; j++)
    {
        if (a[i] != a[j])
        {
            Count.Add(a[i], j - i);
            i = j - 1;
            break;
        }
        if (j == a.Length - 1)
        {
            Count.Add(a[i], j - i + 1);
            i = j;
        }
    }
}
Считает за один проход всего массива.

Добавлено через 42 секунды
В словаре Count ключом будем число из массива, значением - сколько раз встретилось.
1
0 / 0 / 0
Регистрация: 16.09.2014
Сообщений: 5
16.09.2014, 12:37  [ТС]
Ну там нужно сосчитать каких больше и в приоритетном порядке обработать

Добавлено через 1 минуту
А возможно с помощью List дело провернуть?
Мне он как то более знаком
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
16.09.2014, 12:43
Цитата Сообщение от velzevyl Посмотреть сообщение
А возможно с помощью List дело провернуть?
А как ты в элемент List засунешь два значения?

Добавлено через 1 минуту
Dictionary - тот же List, только в отличии от элемента List, элемент Dictionary имеет пару ключ = значение. Почитай про него - ничего сложно в нём нет.
1
0 / 0 / 0
Регистрация: 16.09.2014
Сообщений: 5
16.09.2014, 12:49  [ТС]
Спасибо,главное что бы заморочек с ним не было
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
16.09.2014, 13:23
velzevyl, соврал я тебе, когда сказал, что считает за один проход. Количество итераций по циклу было больше и составляло n + N + 1, где: n - длина массива, N - количество не повторяющихся чисел.
Вот алгоритм с линейной зависимостью итераций n, где n - длина массива:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int[] a = { 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 6, 7, 7, 7, 7, 8 };
Dictionary<int, int> Count = new Dictionary<int, int>();
for (int i = 0; i < a.Length; )
{
    int j;
    for (j = i + 1; j < a.Length; j++)
    {
        if (a[i] != a[j])
        {
            Count.Add(a[i], j - i);
            i = j;
            break;
        }
    }
    if (j == a.Length)
    {
        Count.Add(a[i], j - i);
        break;
    }
}
0
0 / 0 / 0
Регистрация: 16.09.2014
Сообщений: 5
16.09.2014, 13:31  [ТС]
Для дальнейшей работы мне нужно отсортировать Dictionary, но как понял это невозможно без LINQ
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
16.09.2014, 13:48
Отсортировать в каком порядке? В данном случае он уже отсортирован по ключу. Я так понимаю, что тебе нужно отсортировать по количеству повторяющихся значений. Если да, то записывай пары наоборот, не 'число = количество повторений', а 'количество повторений = число'. Тогда сможешь легко воспользоваться методом расширения LINQ OrderBy, который и отсортирует его по числу повторений.

Добавлено через 1 минуту
В общем-то, можно и без LINQ. Берёшь быструю сортировку и сортируешь. Но это велосипед, на котором успешно катается LINQ.
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
16.09.2014, 14:17
velzevyl, а чем linq плох-то? число повторений нужно вообще знать или нет?
C#
1
2
3
4
5
6
7
8
9
10
11
static IEnumerable<int> InOrder(int[] a)
{
    return a.GroupBy(x => x).OrderBy(g => g.Count()).Select(g => g.Key);
}
        
static void Main()
{
    int[] a = { 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 6, 7, 7, 7, 7, 8 };
    foreach (var x in InOrder(a))
        Console.WriteLine(x);
}
Добавлено через 19 минут
вариант с сортировкой, без дефолтного словаря:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
using System;
using System.Collections;
using System.Collections.Generic;
 
namespace TestConsole
{
    class Pair : IComparable 
    {
        public int Value;
        public int Count;
 
        public int CompareTo(object obj)
        {
            if (obj == null) return 1;
 
            Pair p = obj as Pair;
            if (p != null) return this.Count.CompareTo(p.Count);
            else throw new ArgumentException();
        }
    }
 
    static class TaskClass
    {
 
        static IEnumerable<int> InOrder1(int[] a)
        {
            if (a != null && a.Length != 0) 
            {
                int c = 0;
                Pair[] p = new Pair[a.Length];
                
                p[c] = new Pair() { Value = a[0] };
                for (int i = 1; i < a.Length; i++)
                {
                    if (a[i] == a[i - 1]) p[c].Count++;
                    else p[++c] = new Pair() { Value = a[i] };
                }
 
                Array.Sort(p, 0, c + 1);
                for (int i = 0; i <= c; i++)
                    yield return p[i].Value;
            }
        }
 
        static void Main()
        {
            int[] a = { 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 6, 7, 7, 7, 7, 8 };
 
            foreach (var x in InOrder1(a))
                Console.WriteLine(x);
 
            Console.ReadLine();
        }
    }
}
0
Life Builder
 Аватар для sk007
531 / 496 / 374
Регистрация: 12.01.2011
Сообщений: 1,755
16.09.2014, 17:33
Вот без linq;
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        static int[] Distinct(int[] a)
        {
            HashSet<int> list = new HashSet<int>(a);
            int[] b = new int[list.Count];
            list.CopyTo(b);
                
            return b;
        }
 
        static int DigitCount(int[] a, int b)
        {
            int count = 0;
 
            foreach (var i in a)
                if (i == b) count++;
 
            return count;
        }
 
        public static void Main(string[] args)
        {
            int[] a = { 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 6, 7, 7, 7, 7, 8 };
            
            foreach(var i in Distinct(a))
                Console.WriteLine("Число: {0} - встресается {1} раз(а)", i, DigitCount(a, i));
 
            Console.ReadKey();
        }
1
871 / 721 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
16.09.2014, 19:35
Цитата Сообщение от BozKurt Посмотреть сообщение
Отсортировать в каком порядке? В данном случае он уже отсортирован по ключу.
Dictionary не гарантирует что ключи будут отсортированы, для этого придумали SortedDictionary.
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
16.09.2014, 19:53
Цитата Сообщение от XRoy Посмотреть сообщение
Dictionary не гарантирует что ключи будут отсортированы
Почему?
0
871 / 721 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
16.09.2014, 20:18
BozKurt,
Dictionary это по сути хэш-таблица, вот поэтому.

Добавлено через 8 минут
И вот что написано в msdn
For purposes of enumeration, each item in the dictionary is treated as a KeyValuePair<TKey, TValue> structure representing a value and its key. The order in which the items are returned is undefined.
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
16.09.2014, 21:54
Цитата Сообщение от BozKurt Посмотреть сообщение
В данном случае он уже отсортирован по ключу
Возможно вы имели в виду "расгруппирован по ключу" - словарь гарантирует отсутствие повторений среди ключей.
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
17.09.2014, 01:10
Цитата Сообщение от XRoy Посмотреть сообщение
по сути хэш-таблица
Не по сути, а именно она самая, она же ассоциативный массив. Но это не говорит о том, что ключи хранятся не в том порядке, в котором туда попали.
Цитата Сообщение от XRoy Посмотреть сообщение
И вот что написано в msdn
Там написано, что у оператора foreach для итератора не определён порядок возврата (связано это с тем, что это хеш-таблица, а точнее с методом хранения в них данных).
В моём примере массив ключей (Keys) отсортирован по возрастанию.

Цитата Сообщение от tezaurismosis Посмотреть сообщение
Возможно вы имели в виду "расгруппирован по ключу" - словарь гарантирует отсутствие повторений среди ключей.
"Отсутствие повторений" и "отсортирован по ключу" (типа Int32) немного, точнее совсем разные вещи. И я имел ввиду именно отсортирован... по возрастанию.
0
871 / 721 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
17.09.2014, 01:52
BozKurt,
Вот вам к примеру ответ Джона Скита http://stackoverflow.com/a/23357185

И наконец пример который покажет что никакой порядок там не соблюдается
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
        class S
        {
            private string s;
 
            public S(string s)
            {
                this.s = s;
            }
 
            public override int GetHashCode()
            {
                return s[0] ^ s[2];
            }
 
            public override string ToString()
            {
                return string.Format("S: {0}", s);
            }
        }
 
        private static void Main(string[] args)
        {
            S s = new S("ssf");
            S s1 = new S("s///f");
            S s2 = new S("ss////f");
            S s3 = new S("ssda/f");
            S s4 = new S("sasf");
 
            var dict = new Dictionary<S, int> {{s, 0}, {s1, 0}, {s2, 0}, {s3, 0}, {s4, 0}};
 
            foreach (var i in dict)
            {
                Console.WriteLine(i.Key);
            }
        }
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
17.09.2014, 09:45
Цитата Сообщение от XRoy Посмотреть сообщение
Вот вам к примеру ответ Джона Скита
Там написано тоже самое, что и в MSDN - порядок индексирования ключей в хеш таблице зависит от хеш-функции, что эти ключи "генерирует" возвращает. Поэтому для итератора не определён порядок возврата.
А теперь загляните в переопределение метода GetHashCode в структуре Int32: http://referencesource.microso... f1bdc71dbb
Вы вырываете куски из общего контекста, не останавливаясь на мелочах, которые порой так важны. Тем самым, частные случае (пусть и в преобладающем большинстве) трактуете как постоянную.
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
17.09.2014, 10:48
Цитата Сообщение от BozKurt Посмотреть сообщение
порядок индексирования ключей в хеш таблице зависит от хеш-функции
Какое это имеет отношение к тому, будет отсортирован словарь или нет?
Самое главное - это "The order in which the items are returned is undefined". Словарь не гарантирует, что значения будут храниться и возвращаться в отсортированном виде. Даже если это сейчас происходит в одном частом случае из миллиона, разработчики вправе изменить реализацию в последующей версии и вся эта логика навернётся.
Цитата Сообщение от BozKurt Посмотреть сообщение
Там написано тоже самое, что и в MSDN - порядок индексирования ключей в хеш таблице зависит от хеш-функции
Там не это написано. Как ещё можно понять слова
Цитата Сообщение от Jon Skeet
A Dictionary<,> simply isn't a sorted data structure. The ordering should not be relied on. Even though the current implementation may return entries in the order they were added, that's an implementation detail
0
 Аватар для ReM
4 / 4 / 0
Регистрация: 18.09.2008
Сообщений: 47
17.09.2014, 14:34
В справочнике находяться связь "эл-т массива" - "кол-во повторений".
В List находяться отсортированные эл-ты массива без повторений.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
   class Program
    {
        static void Main(string[] args)
        {
            Random random = new Random();
            int[] a = new int[random.Next(10,25)];
            Console.WriteLine("Исходный массив, элементы которого нужно проверить:");
            for (int i = 0; i < a.Length; i++)
            {
                a[i] = random.Next(9);
                Console.Write("{0} ", a[i]);
            }
            Console.WriteLine("\n-------------------------------");
 
            Dictionary<int, int> rezul = new Dictionary<int, int>(); //считаем эл-ты в массиве
            for (int i = 0; i < a.Length; i++)
            {
                if (rezul.ContainsKey(a[i]))
                    rezul[a[i]]++;
                else
                    rezul.Add(a[i], 1);
            }
 
            Console.WriteLine("Результат подсчета повторяющихся эл-ов:"); //показываем результат подсчета
            foreach (KeyValuePair<int, int> par in rezul)
                Console.Write("{0}[{1}] ", par.Key, par.Value);
            Console.WriteLine("\n*где - ЧИСЛО[КОЛ-ВО ПОВТОРЕНИЙ]\n-------------------------------");
           
            var list = rezul.Keys.ToList(); //ключи справочника копируем в list
            list.Sort(); //кортируем list(ключи)
            Console.Write("Больше всего повторений {0} раз у:", rezul.Values.Max());
            foreach (var key in list)
                if (rezul[key] == rezul.Values.Max())
                       Console.Write(" {0}", key);
 
            Console.ReadKey();
        }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.09.2014, 14:34
Помогаю со студенческими работами здесь

Подсчитать количество всех четырехзначных чисел, в записи которых нет одинаковых цифр
подсчитать количество всех четырехзначных чисел, в записи которых нет одинаковых цифр.Вывести на экран все числа начинающиеся на 98 и...

Подсчитать количество уникальных значений в List
Уже 40 минут туплю над этим вопросом, все найденные примеры на Lynq не помогают. Вот в чем суть. Имеется класс: public class AppInfo ...

List: подсчитать количество повторяющихся значений
Помогите пожалуйста, мне надо подсчитать количество повторяющихся значений. Например List содержит 1,2,2,1,2,3 мне надо вывести: 2-3раза...

Parallel.for подсчитать количество элементов в массиве
Собственно необходимо посчитать количество элементов в двумерном массиве удовлетворяющих определенным условиям. Так как сам массив очень...

Подсчитать количество двузначных чисел в массиве
Дан массив вещественных чисел A, содержащий N элементов. Подсчитать указанное значение для определенных элементов массива:количество...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru