Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как отсортировать Vector (http://www.flasher.ru/forum/showthread.php?t=175764)

HardCoder 23.02.2012 22:23

Как отсортировать Vector
 
Здравствуйте. Мне нужно отсортировать, например, вектор Vector.<SomeObject> по полю prop:uint каждого элемента. То есть проверить каждый элемент вектора и узнать его prop (чем выше prop - тем выше индекс элемента). В справке нет ни одного примера как это сделать. В гугле тоже нет (только информация как сортировать вектор не стандартным sort()). Нашел простой код:
Код AS3:

public function initTurn():void {
        var test:Vector.<int> = new <int>[3,5,2,3,9,0,1,8];
        test.sort(compare);
        for (var i:uint = 0; i < test.length; i++) {
                trace(test[i]);
        }
        // выводит 0,1,2,3,3,5,8,9
}
 
private function compare(x:int, y:int):Number {
        if (x > y) {
                return 1;
        } else if (x < y) {
                return -1;
        } else {
                return 0;
        }
}

Захотел в нем разобраться и переделать под свой случай. Но, как говорится: "смотрю в книгу - вижу фигу". Что это за x и y, откуда они берутся, почему при вызове test.sort(compare) - не передаются никакие параметры, кто получает Number, возвращаемый функцией compare, и что оно с ним делает?
Пожалуйста, подскажите код для сортировки вектора с пользовательским типом (не int, Number, uint). Или, хотя бы, подскажите что за колдовство происходит при вызове этой строчки:
Код AS3:

test.sort(compare);

, может дальше как-нибудь сам разберусь.

СлаваRa 23.02.2012 22:27

общий смысл вкратце:
Код AS3:

var elements:Vector.<int> = new <int>[3,5,2,3,9,0,1,8];
private function compare(element1:int, element2:int):int {
        if (element1 > element2)
                return 1;
        if (element1 < element2)
                return -1;
        return 0;
}


СлаваRa 23.02.2012 22:35

Причем тут массив? Метод сортировки у Vector свой.
Описание параметров, которые он принимает:
Цитата:

Параметры

compareFunction:Function — Метод сравнения, определяющий поведение при сортировке.
Указанный метод должен взять два аргумента базового типа (T) вектора и возвратить число:

function compare(x:T, y:T):Number {}
Логика функции compareFunction такова, что при наличии двух элементов x и y функция возвращает одно из следующих трех значений:

отрицательное число, если x стоит перед y после сортировки;
0, если x равно y;
положительное число, если элемент x должен следовать за y в отсортированной последовательности.

HardCoder 23.02.2012 22:35

СлаваRa, спасибо, теперь понял: x и y - это просто перебираемые элементы вектора :). В таком случае вот как надо:
Код AS3:

var test:Vector.<SomeObject> = new <SomeObject>[obj1, obj2, obj3];
test.sort(compare);
 
private function compare(element1:SomeObject, element2:SomeObject):Number {
        if (element1.prop > element2.prop ) {
                return 1;
        } else if (element1.prop < element2.prop) {
                return -1;
        } else {
                return 0;
        }
}


СлаваRa 23.02.2012 22:37

ну да, так и есть

HardCoder 23.02.2012 22:41

Вот я не хороший человек!!! Только сейчас увидел про функцию сравнения в справке :). Читал когда-то давно и то ли не понял, то ли не дочитал. А сейчас - вместо того чтобы еще раз посмотреть - начал искать черную кошку в темной комнате, которой в этой комнате нет...

wvxvw 24.02.2012 01:28

Что смешно, так это то, что этот пример - бездумная копия из мануала, на самом деле не нужно возвращать строго -1, 0 или 1, достаточно просто возвращать положительное, отрицательное и 0. Т.е. функция сортировки может выглядеть так:

Код AS3:

private function sortHelper(x:int, y:int):int
{
        return x - y;
}

Да, с поправкой на то, что если вы предвидите ситуацию, когда будет переполнение, например, если отнять 1 от int.MIN_VALUE, то, возможно, есть смысл нормализовать значения, например так:

Код:

1 / (1 / y - 1 / x)
Но если такие случаи не предвидятся, то это будет лишним.

fljot 24.02.2012 03:15

Цитата:

Сообщение от wvxvw (Сообщение 1065056)
на самом деле не нужно возвращать строго -1, 0 или 1, достаточно просто возвращать положительное, отрицательное и 0.

А это советую перепроверить. Помню, был как-то очень удивлён, что сортировка работала неправильно — оказалось надо именно -1, 0, 1, хотя в документации было сказано про положительные и отрицательные в общем.

wvxvw 24.02.2012 04:16

Я проверил - у меня работает :)

В конце концов, если так уж прям замуж невтерпеж, то
Код AS3:

private function sortHelper(x:int, y:int):int
{
        var result:int = x - y;
        return Math.abs(result) / result;
}


Dima_DPE 24.02.2012 14:00

Цитата:

Сообщение от wvxvw (Сообщение 1065078)
В конце концов, если так уж прям замуж невтерпеж, то
Код AS3:

private function sortHelper(x:int, y:int):int
{
        var result:int = x - y;
        return Math.abs(result) / result;
}


Очень опасный вариант, при равных x и y, result будет равен 0, а всем известно что 0/0=NaN, и вот тут спасает только приведение к int, т.к. int(NaN)=0. Но все это очень опасно, я бы так не делал.


Часовой пояс GMT +4, время: 21:16.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.