ActionScript 3 Условный - PullRequest
       10

ActionScript 3 Условный

0 голосов
/ 10 октября 2010

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

Код массива:

Код 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

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

Ответы [ 2 ]

2 голосов
/ 10 октября 2010

Robusto верен, в вашем утверждении 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;
  }
}

См. Документацию по вектору .: 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;
  }
}
1 голос
/ 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) ) 

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

...