|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Mar 2016
Сообщений: 34
|
Как правильно написать код вывода уникальных элементов массива?
У меня есть массив из 100 элементов, мне нужно вывести 10 элементов, так чтобы они не повторялись. Я уже написал код, но я думаю, он не совсем правильный. Какие варианты ещё существуют реализации этой задачи?
var arr1:Array = new Array(); var arr2:Array = new Array(); var ii; var t; var maxnum = 100; var num = 10; for(var i = 0; i < maxnum; i++) { arr1.push(i); arr2.push(i); } for(var j = 0; j < maxnum; j++) { arr1[j] = 0; } for(var k = 0; k < maxnum; k++) arr2[k] = k; ii = 1; while(ii<num) { t=1+Math.round(Math.random()*maxnum); if(arr2[t]!=0) { arr1[ii]=arr2[t]; trace(arr1[ii]); arr2[t]=0; ii++; } } |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
// entry point var sourceArray:Array = new Array(); var resultArray:Array = new Array(); var maxnum:int = 100; var num:int = 10; for(var i:int = 0; i < maxnum; i++) sourceArray.push(i); for (var j:int = 0; j < num; j++) { var k:Object = null; do { k = sourceArray[int(Math.random() * maxnum)]; } while(resultArray.indexOf(k) != -1); resultArray[j] = k; } trace(resultArray);
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Mar 2016
Сообщений: 34
|
Спасибо за помощь, но я решил все же сам подумать над проблемой, перепробовал кучу вариантов и нашёл на мой взгляд самый лучший с помощью перемешивания всего массива.
var arr:Array = new Array(); var arr2:Array = new Array(); var swap,tmp, num:uint; num = 5; for(var i = 0; i < 20; i++) { arr.push(i); } for(var j = 0; j < arr.length; j++) { swap = Math.floor(Math.random() * j); tmp = arr[j]; arr[j] = arr[swap]; arr[swap] = tmp; } for(var ii = 0; ii < num; ii++) { arr2.push(arr[ii]); } trace(arr2); |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
1. Формулировка "так, чтобы они не повторялись". Ну, ты можешь взять первые десять элементов, и они не будут повторяться)) У тебя даже слова "случайных" нет, можно только по коду догадаться.
2. Повторяемость вещь неоднозначная, когда речь идет о массиве. Ведь массив может быть из ста одинаковых ("повторяющихся") элементов Потому что массив хранит не сами объекты, а ссылки на них. Так что все элементы могут ссылаться на один и тот же объект. В моем коде в выборку попадают только уникальные, но если в исходном массиве не наберется num уникальных, мой код зависнет (while() вообще потенциально опасен). 3. Почитай про методы массива, типа .slice(), .splice(). Вместо последнего цикла можно использовать вырезку, а можно сделать массив-копию через .concat() и обрезать через .length = num;
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Mar 2016
Сообщений: 34
|
Я с самого начала думал, сделать выборку элементов массива с помощью перемешивания, а потом вывода 5 первых элементов. Но всё же решил уточнить на форуме, посмотрел много вариантов реализации этого примера с помощью установки маркера flag, а так же нашёл исходники покера где выбирается 5 карт, там было сделано с помощью splice. Но в итоге я решил всё же остановится на выборе перемешивания и вывода пяти элементов. Мне нужно получить 5 уникальных неповторяющих значения и чтобы каждый раз они были новые. Здесь я уверен, что повторов не будет.
Добавлено через 2 минуты Цитата:
|
Часовой пояс GMT +4, время: 15:53. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|