У меня есть то, что я думаю, должно быть легкой проблемой. Я читаю массив и подсчитываю вхождения значений в него, затем записываю их в некоторые переменные, которые я хочу сравнить в условном выражении. Мое условное выражение должно отслеживать, какое число встречается чаще.
Код массива:
Код 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
больше одного, чем что-либо еще
Ответ 1 · рейтинг 2 · Joony
Робусто прав, у вас ошибка в операторе 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;
}
}
Ответ 2 · рейтинг 1 · Robusto
Когда вы пишете:
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) )
В любом случае, действительно неясно, что вы пытаетесь сделать.