Я нигде не нашел(или плохо искал) методов, которые либо были бы уже предопределены в АПИ по JDK, либо - что еще похлеще, - были бы заданы в какомто интерфейсе (типа Collection), в которых нужно было бы их описать самому.
По перемешиванию/тасованию элементов есть немало алгоритмов, согласен. Я в принцыпе, признаюсь - искал не так уж много, потому что при поиске результаты предлагали мне алгоритмы на основе математики/алгебры, каких то сложных вычитаний и тому подобное.
Я, откровенно говоря, не любитель программировать, исользуя паттерны, построенные на основе математических формул(знаю, что зря, так как большинство задач без простейших формул - не реализовать). Еще более гнетет то что великого старину Доналда Кнута я так и не прочел. Дело в том что там большинство алгоритмов на математических формулах и основаны(бля, меня колбасит от такого)))…
Короче говоря, решил выложить тут, может кому пригодится - простейший алгоритм тасовки элементов(без всяких алгебраических формул/выебонов), содержащихся в массиве. Если такой вы уже где то использовали/встречали/видели - то так и скажите. Наверное все же гдето он не одну тысячу раз использовал. Я ж не хочу ставать в шеренгу очередных изобретателей колес).
Итак, для осуществления перемешивания элементов(вернее - для получения готового массива с такими элементами)
нам сначала понадобится 2 массива.
1й - основной, в котором элементы будут располагаться в исходном постоянном порядке.
2й же - для хранения тех же элементов, но только в перемешанном виде.
Далее - заполняем 1й массив, чем хотите.
Основными инструментами в алгоритме являются размеры 2-х массивов.
Суть лежит в том, что необходимо в цикле(условием которого является сравнение размеров этих 2-х массивов)
каждую итерацию проверять, не содержится ли уже рандомно полученный элемент(в диапазоне от нуля до размера массива) 1го массива - в нашем втором массиве.
Если не содержится - тогда добавляем во 2й массив. Это, ясень пень - для того чтобы не было дублируищехся значений(если кто не понял).
Ну и….так до того момента пока 2й массив не насобирает то количество значений, которое присуще в 1м массиве.
код:
ArrayList<String> Stack = new ArrayList<String>(14);
ArrayList<String> ShuffledStack = new ArrayList<String>(14);
Stack.add(0,"a");
Stack.add(1,"b");
Stack.add(2,"c");
Stack.add(3,"d");
Stack.add(4,"e");
Stack.add(5,"f");
Stack.add(6,"e");
Stack.add(7,"g");
Stack.add(8,"h");
Stack.add(9,"j");
Stack.add(10,"k");
Stack.add(11,"l");
Stack.add(12,"o");
Stack.add(13,"m");
int size = Stack.size();
while(ShuffledStack.size() != size)
{
int r = (int)(Math.random()*(size));
if(!ShuffledStack.contains( Stack.get( r )))
ShuffledStack.add( Stack.get( r ));
}
Алгоритм - прост до невозможности.
Меня, вообще заинтересовала данная тема. Если у кого есть подобные мысли, иные реализации алгоритма в самом эффективном/оптимальном пути - пожалуйста, делитесь.