Просмотр полной версии : Подскажите по неравенствам:)
oiBulldog
02.05.2009, 02:45
Объясните пожалуйста, почему в одном случае выдаётся "true", в другом "false", причём это всё как то связано с "1", при замене допустим на "4" или "6" в обоих случая выдаётся "true". Подскажите как происходит обсчёт и как этого избежать, чтобы всё считалось верно?
q = 9;
w = 8;
e = 7;
r = 1;
trace(q!=w!=e!=r);
trace(q!=w!=r!=e);
Как избежать - не писать подобных конструкций. Есть скобки, есть && и ||. Не надо лишний раз запутывать компилятор и себя.
Для оформления своего кода надо использовать теги (http://www.flasher.ru/forum/showthread.php?t=122539)
При неравенстве с единицей, последняя преобразуется в булево значение true, что не происходит с другими числами, они дают false. Есть строгое неравенство !== там такого не будет.
В вашем случаи q!=w это true, true != 7 тоже true, а true != 1, это true != true, что дает false.
Получается:
(true != true) != false, это false != false и результат true
(true != false) != true, это true != true и результат false
oiBulldog
02.05.2009, 13:35
Ясно, немного разобрался в механизме. Спасибо. Но тогда возникает вот какой вопрос, а как тогда всё таки добиться того, что изначально планировал, как должно выглядеть уровнение, которое выдаёт "false" в том случае если хотя бы "2" из "n" чисел равны и "true" в том случае если все числа отличны друг от друга?:)
Psycho Tiger
02.05.2009, 13:49
Ну, каждое нужно сравнить с каждым. Это 2 вложенных цикла.
oiBulldog
02.05.2009, 14:25
Это ясно, то есть без цикла не обойтись?)
Psycho Tiger
02.05.2009, 14:40
Ну в голову пока идея не лезет.
Когда на бумажке смотришь на цифры, ты ведь каждый сравниваешь с каждым, так?
Можно, ручками.
trace(q!=w && q!=e && q!=r && w!=e && w!=r && e!=r);
Но смотрите, для 3-х чисел нужно 3 сравнения, для 4-х 6, а для 5 - 10. А если чисел больше?
Но два цикла не надо, хватит одного.
var array:Array = [9, 8, 7, 1];
var arrayComparison:Array = [];
var result:Boolean = true;
for (var i:Number = 0; i < array.length; i++) {
if (arrayComparison[array[i]] == true) {
result = false;
break;
} else {
arrayComparison[array[i]] = true;
}
}
trace (result);
var array:Array = [9, 8, 7, 1, 5, 4];
var result:Boolean = true;
var index:Number;
for (var i:Number = 0; i < array.length; i++) {
index = array.indexOf(array[i]);
if (index >= 0 && index != i) {
result = false;
break;
}
}
trace (result);
:p
Гениально! Спасибо, никогда бы сам такое не придумал))) Меня только на такое хватило))
var array:Array = [1, 8, 4, 9];
var arrayCom:Array = array.sort();
var result:Boolean = true;
for (var i:Number = 0; i < arrayCom.length; i++) {
if (arrayCom[i] == arrayCom[i+1]) {
result = false;
break;
}
}
trace (result);
Денис, а почему у тебя результат false, когда в массиве все числа разные?
Скорее всего при обратном пробеге работать будет быстрее :)
У iNils-а, по идее, работать должен ещё быстрее.
iNils, у тебя неправильный флеш :) Копипаст кода выдает true.
UPD: Опа, под AS3 работает, под AS2 нет :(
Добавлено через 10 минут
Нате вот:
var array:Array = [9, 8, 7, 1, 5, 4, 6];
var str:String = '|' + array.join('|') + '|';
var result:Boolean = true;
for (var i:String in array) {
i = '|' + i + '|';
if (str.indexOf(i) != str.lastIndexOf(i)) {
result = false;
break;
}
}
trace(result);
:D
Ну да, в АС2 не было Аrray.indexOf ))))
Psycho Tiger
02.05.2009, 15:30
Wolsh, у тебя сравнивает это со следующим, так что не катит.)
__etc, разве indexOf по сути сам не работает как цикл? ИМХО с вложенным циклом будет бегать быстрее, чем с indexOf (если indexOf реализован тоже на АС, черт его знает скорость прогонки, если не на нем написан), надо проверить, как будет минутка.
2iNils: *___* ты гений)
Psycho Tiger, у Wolsh-а сортировка в начале :)
Mnilionic
02.05.2009, 22:01
вот и моя очередь подошла предложить оптимальный вариант:
var arr = [1, 2, 3, 3, 5];
var result:Boolean = !!arr.sort(12);
trace(result);
:)
Psycho Tiger
03.05.2009, 13:34
2__etc: ой, проглядел :)
Гм, вообще странно... АС без угрызений совести записывает в Boolean массив, (без !!), даже не сругиваясь на тип мисмач... Вообще, обьясните мне как этот код работает?
Хелп:If you specify a value of 4 or Array.UNIQUESORT for the options parameter and two or more elements being sorted have identical sort fields, Flash returns a value of 0 and does not modify the array. Соотв. если вернет 0 - приводится к false, !false дает true и !true опять false)) А если вернет массив - то цепочка преобразований начнется с true и им, соответственно, закончится.
Единственно, я не знаю что такое 12, но с 4 нормально вроде работает.
На самом деле, там не нужно 12, хватит и 4.
4 - соответствует константе Array.UNIQUESORT - "Задает уникальное требование сортировки для методов сортировки класса Array. Эта уникальная возможность прекращает сортировку, если любые два сортируемых элемента имеют одинаковые значения." Таким образом, как если будут найдены два одинаковых числа, sort вернет число 0, а в других случаях массив. Двойное отрицание сначала переводит результат в булев тип (0 в true, массив в fasle), а потом инвертирует булев тип в необходимое нам по условию значение.
Psycho Tiger
03.05.2009, 19:24
Дак я так и не понял - я четко указал тип Boolean - на какой радости туда флеш посмел записать массив?
Потому что это AS1/AS2 :)
Типизация отсутствует в runtime.
Итак, резюме
Но тогда возникает вот какой вопрос, а как тогда всё таки добиться того, что изначально планировал, как должно выглядеть уровнение, которое выдаёт "false" в том случае если хотя бы "2" из "n" чисел равны и "true" в том случае если все числа отличны друг от друга?
trace( Boolean([1, 3, 3, 2, 5].sort(Array.UNIQUESORT)) );
Mnilionic
04.05.2009, 21:40
12 это 4 + 8.
Потому, что если в массиве все зачения уникальны, то массив отсортируется.
Поэтому, чтоб изначальный массив оставался неизменным и плюсуется 8.
Хотя если плевать на очерёдность элементов, то пусть сортируются :)
Так лучше?
var arr:Array = new Array (1, 3, 3, 2, 4);
// TODO: Debug alternate array value
//var arr:Array = new Array (1, 3, 2, 4);
trace( Boolean(arr.sort(Array.UNIQUESORT | Array.RETURNINDEXEDARRAY)) );
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.