Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Сортировка двумерного массива (http://www.flasher.ru/forum/showthread.php?t=78619)

PoMaH 20.04.2006 21:55

Сортировка двумерного массива
 
Допустим мы имеем двумерный массив:
var array:Array = new Array(["Чижик", 2], ["Ёжик", 5], ["Айболит", 3], ["Винни-пух", 1], ["Пыжик :)", 4]);

мне его нужно отсортировать по первому элементу. Это я могу осуществить с помощью array.sortOn(0); , но результат меня не устраивает: Я не хочу чтобы Ёжик был перым! :)

Как можно по нормальному отсортировать?
Просто array.sort(maySortOrder); не предлагать, нужно обязательно сортировать двумерный массив.

iNils 21.04.2006 00:36

С помощью array.sort(maySortOrder); можно и двухмерный массив отсортировать.

iNils 21.04.2006 03:14

собственно сама функция сортировки
Код:

sortIO = function (a, b) {
        //// значение по умолчанию
        var r = 0;
        //// обычная функция проверки
        if (a > b) {
                r = 1;
        } else if (a < b) {
                r = -1;
        }
        //// если в словах было символ Ё и слова не равны... 
        if ((a.indexOf ("Ё") != -1 or a.indexOf ("ё") != -1 or b.indexOf ("Ё") != -1 or b.indexOf ("ё") != -1) and r != 0) {
                var a2 = a.split ("");
                var b2 = b.split ("");
                //// проверяем символы последовательно, до первого не совпадениея
                for (var i = 0; i < Math.min (a2.length, b2.length); i++) {
                        //// если символы не равны...
                        if (a2[i] != b2[i]) {
                                var ac = a2[i].charCodeAt ();
                                var bc = b2[i].charCodeAt ();
                                //// проверка на положение Ё
                                if ((ac == 1025 and bc > 1045) or (ac == 1105 and bc > 1077) or (ac < 1046 and bc == 1025) or (ac < 1078 and bc == 1105)) {
                                        r = -1;
                                } else if ((ac == 1025 and bc < 1046) or (ac == 1105 and bc < 1078) or (ac > 1045 and bc == 1025) or (ac > 1077 and bc == 1105)) {
                                        r = 1;
                                }
                                //// дальше сравнивать не имеет смысла 
                                break;
                        }
                }
        }
        return r;
};

проверям
Код:

arrayT = ["ае- 7", "АЖ- 3", "АЁ- 2", "АЕ- 1", "ЁА- 5", "ЖА- 6", "ЕА- 4", "аж- 9", "ёа-11", "ёа-11", "еа-10", "жа-12", "аё- 8"];
arrayT.sort (sortIO);
for (var i = 0; i < arrayT.length; i++) {
        trace (arrayT[i]);
}
trace ("");
//// должно быть true
trace (String (arrayT) == "АЕ- 1,АЁ- 2,АЖ- 3,ЕА- 4,ЁА- 5,ЖА- 6,ае- 7,аё- 8,аж- 9,еа-10,ёа-11,ёа-11,жа-12");
trace ("");

проверям по поставленной задаче (расширил чтобы уж наверняка)
Код:

sort2D = function (a, b) {
        return sortIO (a[0], b[0]);
};
arrayA = new Array (["чижик", 2], ["ёжик", 5], ["айболит", 3], ["винни-пух", 1], ["пыжик ", 4],["Чижик", 2], ["Ёжик", 5], ["Айболит", 3], ["Винни-пух", 1], ["Пыжик ", 4]);
arrayA.sort (sort2D);
for (var i = 0; i < arrayA.length; i++) {
        trace (arrayA[i]);
}


PoMaH 21.04.2006 06:39

ОГО! Что то не допер до этого. Классно, спасибо! :yahoo:
:)


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

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