Как перетасовать массив, сохраняя сгруппированные вместе одинаковые значения?
Скажем, у меня есть такой массив.
int[] arr = {1,2,3,4,4,5,6,7,8,8,8};
Как мне перемешать их, но все с одинаковым значением по-прежнему расположены друг напротив друга?
Пример ожидаемого результата после перемешивания:
3,1,8,8,8,7,2,4,4,6,5
2 ответа
Вы можете сделать что-то вроде этого:
- Найдите уникальные значения в массиве и количество повторений каждого из них. Сохраните счетчики в словаре, скажем
counts
. - Перемешайте уникальные значения, используя алгоритм перемешивания, такой как Fisher-Yates.
- Для каждого значения в перетасованном массиве напишите
v
в выходной массивcounts[v]
раз.
arr = arr
.GroupBy(i => i)
.OrderBy(g => rnd.Next())
.SelectMany(g => g)
.ToArray();