ActionScript 3 Условный

У меня есть то, что я думаю, должно быть легкой проблемой. Я читаю массив и подсчитываю вхождения значений в него, затем записываю их в некоторые переменные, которые я хочу сравнить в условном выражении. Мое условное выражение должно отслеживать, какое число встречается чаще.

Код массива:

Код ActionScript:

private function runCount(scoreArray:Array, count1:Number, count2:Number, count3:Number):void {
    for (var i:int=0; i < scoreArray.length; i++) {
        if (scoreArray[i] == count1) {
        _1count++;// = _1count + 1;
        trace("1Count is:",_1count);
        }
    }

    for (var o:int=0; o < scoreArray.length; o++) {
        if (scoreArray[o] == count2) {
        _2count++;// = _2count + 1;
        trace("2Count is:",_2count);
        }
    }

    for (var p:int=0; p < scoreArray.length; p++) {
        if (scoreArray[p] == count3) {
        _3count++;// = _3count + 1;
        trace("3Count is:",_3count);
        }
    }
    runFinal();
}

И условный код:

Код ActionScript:

public function runFinal():void {
    if (_1count > _2count || _3count) {
        trace("more one than anything else");
    } else if (_2count > _1count || _3count) {
        trace("more two than anything else");
    } else if (_3count > _1count || _2count) {
        trace("more three than anything else");
    }
}

Теперь я не получаю ошибок, но мой условный оператор очень запутан и выдает случайные результаты. Любые идеи?

Спасибо.

Обновление: в качестве примера это то, что он мне дает.

1Count is: 1
1Count is: 2
2Count is: 1
2Count is: 2
3Count is: 1
3Count is: 2
3Count is: 3

больше одного, чем что-либо еще


person Peter    schedule 10.10.2010    source источник
comment
Вы пропустили код массива. Мы не видим, что здесь задумано. Что именно пытается сделать, трижды перебирая один и тот же массив?   -  person Robusto    schedule 10.10.2010


Ответы (2)


Робусто прав, у вас ошибка в операторе if. Первое, что на самом деле проверяется, это если _1count больше, чем _2count, или _3count больше 0. Таким образом, _1count может быть 10, _2count может быть 15, а _3count может быть 5, и это будет оцениваться как true.

Вы можете использовать массив объектов и сортировать их, чтобы получить правильный ответ, это позволит сэкономить на написании все большего количества условий, если вы увеличите количество элементов, которые хотите подсчитать. Это будет выглядеть примерно так:

var count0:Counter = new Counter('count0');
var count1:Counter = new Counter('count1');
var count2:Counter = new Counter('count2');
var counters:Vector.<Counter> = Vector.<Counter>([count0, count1, count2]);

counters[0].value = 101;
counters[1].value = 67;
counters[2].value = 172;

counters.sort(sortOnValue, Array.DESCENDING);

trace('The highest value was: ' + counters[0].name);  // The highest value was: count2

function sortOnValue(a:Object, b:Object):Number{
    if(a.value > b.value) {
        return 1;
    }else if(a.value < b.value) {
        return -1;
    }else{
        //a.value == b.value
        return 0;
    }
}

class Counter {
  public var name:String;
  public var value:int;

  public function Counter(name:String){
    this.name = name;
  }
}

См. документацию для Vector.: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Vector.html?filter_flash=cs5&filter_flashplayer=10.1&filter_air=2#sort()

Хорошо, способ №2:

var count0:Object = {name:'count0', value:0};
var count1:Object = {name:'count1', value:0};
var count2:Object = {name:'count2', value:0};
// Vector doesn't have the sortOn method, so use an Array instead
var counters:Array = [count0, count1, count2];

counters[0].value = 101;
counters[1].value = 67;
counters[2].value = 172;

counters.sortOn('value', Array.DESCENDING | Array.NUMERIC);

trace('The highest value was: ' + counters[0].name);

Дополнительные способы сделать то же самое см. в документации по Array: http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/Array.html#sort()

Или смесь того и другого:

var count0:Counter = new Counter('count0');
var count1:Counter = new Counter('count1');
var count2:Counter = new Counter('count2');
var counters:Array = [count0, count1, count2];

counters[0].value = 101;
counters[1].value = 670;
counters[2].value = 1720;

counters.sortOn('value', Array.DESCENDING | Array.NUMERIC);

trace('The highest value was: ' + counters[0].name);

class Counter {
  public var name:String;
  public var value:int;

  public function Counter(name:String){
    this.name = name;
  }
}
person Joony    schedule 10.10.2010
comment
+1 ... даже лучше было бы использовать Vector вместо Array, поскольку все его содержимое будет иметь один и тот же тип данных Object. - person Chunky Chunk; 10.10.2010
comment
Еще лучше было бы создать конкретный объект (DTO) с именем и значением в качестве свойств. Таким образом, игроку не придется возиться с хеш-таблицей для отслеживания свойств динамических объектов (= быстрее в меньшем объеме памяти). - person Joony; 11.10.2010
comment
+1. Хотя вы можете избавиться от функции сравнения, если просто используете метод sortOn. Вот так: counters.sortOn("value", Array.DESCENDING | Array.NUMERIC); - person Juan Pablo Califano; 11.10.2010
comment
Верно, но следует отметить, что тогда вы не можете использовать вектор вместо массива, так как у вектора нет метода sortOn. - person Joony; 11.10.2010
comment
Я не очень понимаю, почему sortOn лучше подходит для Vector. - person Joony; 13.10.2010

Когда вы пишете:

public function runFinal():void {
    if (_1count > _2count || _3count) {
        trace("more one than anything else");
    } else if (_2count > _1count || _3count) {
        trace("more two than anything else");
    } else if (_3count > _1count || _2count) {
        trace("more three than anything else");
    }
}

ваши условные выражения выглядят ошибочными. Как написано, если последний термин условного выражения когда-либо оценивается как истинный (ненулевой и т. д.), условное утверждение будет оцениваться как истинное, что я не думаю, что вы намереваетесь.

Вы пытаетесь сказать «если _1count больше, чем _2count или _3count»? Если это так, вы бы написали это как

if ( (_1count > _2count) || (_1count > _3count) ) 

В любом случае, действительно неясно, что вы пытаетесь сделать.

person Robusto    schedule 10.10.2010
comment
Привет. Спасибо за это. То, что я делаю, это нажатие кнопки, я помещаю число в массив (1, 2 или 3). Когда вы нажимаете четвертую кнопку, я перебираю массив и проверяю наличие этих чисел, складываю их и записываю в набор переменных. Затем я проверяю, какое число больше, поэтому я знаю, какая кнопка была нажата наибольшее количество раз. Теперь я думаю, что я мог бы просто увеличивать переменную на +1 при каждом нажатии кнопки, но я узнаю о разных способах делать что-то. :) Я могу опубликовать весь код, если это поможет? - person Peter; 10.10.2010
comment
Если вам нужен полезный ответ, размещение всего соответствующего кода всегда помогает. - person Robusto; 10.10.2010