PDA

Просмотр полной версии : Подскажите по неравенствам:)


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);

VVall
02.05.2009, 03:05
Как избежать - не писать подобных конструкций. Есть скобки, есть && и ||. Не надо лишний раз запутывать компилятор и себя.

iNils
02.05.2009, 03:41
Для оформления своего кода надо использовать теги (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
Ну в голову пока идея не лезет.
Когда на бумажке смотришь на цифры, ты ведь каждый сравниваешь с каждым, так?

iNils
02.05.2009, 14:45
Можно, ручками.
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);

etc
02.05.2009, 14:58
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

Wolsh
02.05.2009, 15:00
Гениально! Спасибо, никогда бы сам такое не придумал))) Меня только на такое хватило))
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);

iNils
02.05.2009, 15:02
Денис, а почему у тебя результат false, когда в массиве все числа разные?

etc
02.05.2009, 15:03
Скорее всего при обратном пробеге работать будет быстрее :)
У 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

Wolsh
02.05.2009, 15:21
Ну да, в АС2 не было Аrray.indexOf ))))

Psycho Tiger
02.05.2009, 15:30
Wolsh, у тебя сравнивает это со следующим, так что не катит.)

__etc, разве indexOf по сути сам не работает как цикл? ИМХО с вложенным циклом будет бегать быстрее, чем с indexOf (если indexOf реализован тоже на АС, черт его знает скорость прогонки, если не на нем написан), надо проверить, как будет минутка.

2iNils: *___* ты гений)

etc
02.05.2009, 15:34
Psycho Tiger, у Wolsh-а сортировка в начале :)

Mnilionic
02.05.2009, 22:01
вот и моя очередь подошла предложить оптимальный вариант:
var arr = [1, 2, 3, 3, 5];
var result:Boolean = !!arr.sort(12);
trace(result);
:)

iNils
02.05.2009, 22:22
Отлично.

Psycho Tiger
03.05.2009, 13:34
2__etc: ой, проглядел :)

Гм, вообще странно... АС без угрызений совести записывает в Boolean массив, (без !!), даже не сругиваясь на тип мисмач... Вообще, обьясните мне как этот код работает?

Wolsh
03.05.2009, 13:57
Хелп: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 нормально вроде работает.

iNils
03.05.2009, 13:58
На самом деле, там не нужно 12, хватит и 4.
4 - соответствует константе Array.UNIQUESORT - "Задает уникальное требование сортировки для методов сортировки класса Array. Эта уникальная возможность прекращает сортировку, если любые два сортируемых элемента имеют одинаковые значения." Таким образом, как если будут найдены два одинаковых числа, sort вернет число 0, а в других случаях массив. Двойное отрицание сначала переводит результат в булев тип (0 в true, массив в fasle), а потом инвертирует булев тип в необходимое нам по условию значение.

Psycho Tiger
03.05.2009, 19:24
Дак я так и не понял - я четко указал тип Boolean - на какой радости туда флеш посмел записать массив?

etc
03.05.2009, 20:05
Потому что это AS1/AS2 :)
Типизация отсутствует в runtime.

dimarik
04.05.2009, 12:16
Итак, резюме

Но тогда возникает вот какой вопрос, а как тогда всё таки добиться того, что изначально планировал, как должно выглядеть уровнение, которое выдаёт "false" в том случае если хотя бы "2" из "n" чисел равны и "true" в том случае если все числа отличны друг от друга?

trace( Boolean([1, 3, 3, 2, 5].sort(Array.UNIQUESORT)) );

Mnilionic
04.05.2009, 21:40
12 это 4 + 8.
Потому, что если в массиве все зачения уникальны, то массив отсортируется.
Поэтому, чтоб изначальный массив оставался неизменным и плюсуется 8.

Хотя если плевать на очерёдность элементов, то пусть сортируются :)

dimarik
04.05.2009, 23:37
Так лучше?

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)) );