Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Сколько раз элемент повторяется в массиве. (http://www.flasher.ru/forum/showthread.php?t=203717)

scnippers 05.10.2013 21:17

Сколько раз элемент повторяется в массиве.
 
Всем привет. У меня есть массив в котором лежат id из вконтакта вообщем это не важно. Важно то что в массиве есть повторяющиеся id нужно узнать сколько раз повторяется id в массиве я делаю так
Код AS3:

for(var k:Number=0;k<allIdFriends.length;k++)
                        {
                                topStar.push(0); // массив в котором находятся сколько раз повторялся id
                        }
                        for(var i:Number = 0;i<allIdFriends.length;i++)
                        {
                                for(var j:Number = 0;j<allIdFriends.length;j++)
                                {
 
                                                if(allIdFriends[i]==allIdFriends[j])
                                                {
                                                        topStar[i] = topStar[i]+1;
                                                        allIdFriends.splice(j,1);
                                                }
 
                                }
                        }

но почему то проскакивают одинаковые id. Подскажите плз как доработать код.

Elff 05.10.2013 23:35

Код AS3:

var idArray:Array = [065161555,06599789,56481100,56899200,48889884,06599789,849944441,06599789,065161555];
var idCountersArray:Array = [];
 
var i:int = idArray.length;
while (i--) idCountersArray.push(0);
 
for (var j:int = 0; j<idArray.length; j++) {
        for (var q:int = idArray.length-1; q>j; q--) {
                if (idArray[j] == idArray[q]) {
                        idCountersArray[j]++;
                        idArray.splice(q, 1);
                        idCountersArray.splice(q, 1);
                }
        }
}
 
trace(idArray);
trace(idCountersArray);


Wolsh 06.10.2013 00:12

После удаления элемента с индексом j элемент, который был за ним (j + 1) становится элементом с индексом j. А цикл переходит на следующую итерацию j + 1. Таким образом элемент и проскакивает — когда два или больше одинаковых id оказываются рядом. Нужно после каждого сплайса возвращать итератор на единицу назад, то есть делать j--.
Рассмотрите так же, что происходит с итератором цикла i.
И Вас не пугает, что в какой-то из проверок Вы уничтожите сам образец (i==j) и замените его следующим элементом?

scnippers 06.10.2013 13:36

Цитата:

Сообщение от Wolsh (Сообщение 1147778)
После удаления элемента с индексом j элемент, который был за ним (j + 1) становится элементом с индексом j. А цикл переходит на следующую итерацию j + 1. Таким образом элемент и проскакивает — когда два или больше одинаковых id оказываются рядом. Нужно после каждого сплайса возвращать итератор на единицу назад, то есть делать j--.
Рассмотрите так же, что происходит с итератором цикла i.
И Вас не пугает, что в какой-то из проверок Вы уничтожите сам образец (i==j) и замените его следующим элементом?

применил ваш совет. Теперь одинаковых нет, но почему то в самом начале появляется длинный id которого не существует в изначальном массиве его нет.
вот так я их вывожу: id - сколько раз повторяется
вот часть
29196347101 - 5 - что за id такой откуда он взялся??
198420044 - 0 - и почему здесь нули??
100192424 - 74
196992613 - 9
101949783 - 79
217388209 - 0
34807332 - 1
178105535 - 1

Wolsh 06.10.2013 14:24

Технически я конечно могу переслать Ваши вопросы в "Битву экстрасенсов", но, думаю, будет лучше, если Вы сами им напишите?
А мы тут обсуждаем ActionScript 3.0.
Не вижу в Вашем сообщении предмета для обсуждения. Где код?

mikhailk 06.10.2013 15:19

Цитата:

Важно то что в массиве есть повторяющиеся id нужно узнать сколько раз повторяется id
Только тупой и очевидный код работает надежно и предсказуемо :)

Код AS3:

 
var ids:Array = [ 1,2,3,4,3,3,2,2,1 ];
var idCounts:Array = new Array();
 
for (var i:int=0;i<ids.length;i++)
{
  var key:String = String(ids[i]);
  if (idCounts[key]) idCounts[key]++;
  else idCounts[key] = 1;
}
 
for (key in idCounts)
{
  trace(key,":",idCounts[key]);
}



Часовой пояс GMT +4, время: 10:55.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.