поиск последовательностей в массиве AS3 - PullRequest
0 голосов
/ 28 февраля 2012

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

Например, мой массив:

var numbers:Array = new Array(banana, banana, apple, banana, banana);

, и мне нужно найтиis: * сколько раз есть последовательность "бананов" * и длина каждой последовательности.

какую оболочку я делаю, чтобы получить следующий результат: 2,1,2 (2 банана, 1яблоко, 2 банана)

я пробовал с циклом do while, но я думаю, я что-то упустил.

короткий пример будет очень полезен!

thanx

Ответы [ 5 ]

1 голос
/ 28 февраля 2012
var prev:String = null;
var q:int = 0;
var result:Array = new Array();
for(var i:int=0; i<numbers.length; ++i){
  if(prev!=numbers[i]){
    if(q>0) result.push(q);
    q=1;
    prev=numbers[i];
  }
  else ++q;
}
if(q>0) result.push(q);

Это при условии, что банан и т. Д. Являются строками (возможно, опечатка выше?).Было бы просто изменить другие типы объектов

0 голосов
/ 29 февраля 2012

Я считаю, что это то, что вы ищете:

    var array:Array = [
        "banana", "banana",
        "apple",
        "banana", "banana", "banana"
    ];

    var sequences:Array = findSequences(array, "banana");

    trace("sequences:", sequences); // prints "sequences: 2,3"

И:

private function findSequences(array:Array, searchElement:*):Array
{
    var sequences:Array = [];
    var currentSequence:int = 0;

    for each (var element:* in array) {
        if (element == searchElement) {
            currentSequence++;

        } else if (currentSequence > 0) {
            sequences.push(currentSequence);
            currentSequence = 0;
        }
    }

    if (currentSequence > 0) {
        sequences.push(currentSequence);
    }

    return sequences;
}
0 голосов
/ 28 февраля 2012

В вопросе, который вы не определяете banana и apple, в любом случае я бы использовал map или Dictionary для хранения пар ключ / значение, причем ключом является строка / объект, который вы хотитеcount и значение, являющееся счетчиком экземпляров объекта в вашем массиве.

var objectsCounter:Dictionary = new Dictionary();

for (var key:String in numbers) 
{
    if ( objectsCounter[key] )
        objectsCounter[key] = objectsCounter[key] + 1;
    else 
        objectsCounter[key] = 1;
}

Таким образом, вы можете сохранить любой тип в словаре.

edit:

for (var key:String in objectsCounter) 
{
    // iterates through each object key
}

for each (var value:Number in objectsCounter) 
{
    // iterates through each value
}
0 голосов
/ 28 февраля 2012
function sequencesInArray(array:Array):Array {
    var sequence:Array = [];
    var currSequenceCount:uint = 1;
    for (var i:uint = 1; i < numbers.length; i++) {
        if (numbers[i - 1] != numbers[i]) {
            sequence.push(currSequenceCount);
            currSequenceCount = 1;
        } else {
            currSequenceCount++;
        }
    }
    return sequence;
}

Тогда:

var banana:int = 1;
var apple:int = 2;
sequencesInArray([banana, banana, apple, banana, banana]); //returns: [2, 1, 2]
0 голосов
/ 28 февраля 2012

На самом деле все, что вы хотите знать, это то, равна ли строка в индексе n строке в индексе n + 1 ...

var targetIndex:int = numbers.length - 1;
var results:Array = [1];
var resultsIndex:int = 0;
for(var n:int = 0; n < targetIndex; n++) {
    if(numbers[n] == numbers[n+1]) {
        results[resultsIndex]++;
    } else {
        results[++resultsIndex] = 1;
    }
}
trace(results.join(','));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...