Форум 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)
-   -   Array.Sort - проблема с сортировкой русско-английского массива (http://www.flasher.ru/forum/showthread.php?t=127994)

varvaray 27.07.2009 19:00

Array.Sort - проблема с сортировкой русско-английского массива
 
Здравствуйте!
Подскажите, пожайлуста, метод Array.Sort действительно не может отсортировать массив, состоящий из русских и английских слов, перемешанных между собой?
Внизу привожу trace части массива.
И если Array.Sort этого сделать не во состоянии, какие могут быть варианты?

Код AS1/AS2:

32    massive   Subaru  type -          avto
33    massive  Toyota  type -          avto
34    massive  Jeep  type -          avto
35    massive  PUGEOUT  type -          avto
36    massive  PUGEOUT  type -          avto
37    massive  Лаура  type -          avto
38    massive  РРТ  type -          avto
39    massive  Пежо  type -          avto
 
 
 
32    sorted massive  undefined  type -          avto
33    sorted massive  undefined  type -          avto
34    sorted massive  undefined  type -          avto
35    sorted massive  undefined  type -          avto
36    sorted massive  undefined  type -          avto
37    sorted massive  Лаура  type -          avto
38    sorted massive  РРТ  type -          avto
39    sorted massive  Пежо  type -          avto


Mnilionic 28.07.2009 14:36

Код AS1/AS2:

var arr = [ 'Fergie', 'Наташенька', 'Ленок', 'Angelina', 'Анюта''Adriana'];
trace(arr);
arr.sort();
trace(arr)


varvaray 29.07.2009 15:42

Да, спасибо, я читала - но получается, это можно сделать, лишь перебив руками все названия? У меня XML большой, записей на 400. Такой вариант не годится. Причем, после сортировки названий по алфавиту, мне необходимо, чтобы другие массивы, состоящие из записей, соответствующих этим названиям, поменяли порядок в соответствии с сортировкой названий. Т.е. если была запись Jepp, Итальянская, 6, 333-33-33, то после сортировки всей базы по алфавиту, этот адрес и телефон по прежнему соответствовали этому названию.
Реально ли сделать подобное во флеше - или стоит писать программу, которая будет сортировать по названию сам XML?

wvxvw 29.07.2009 15:50

Вы можете написать как выглядят исходные данные и что вы в итоге хотите получить?...
Мне не понятно откуда взялись undefined.
И PEUGEOT пишется с E :)

varvaray 29.07.2009 16:05

Итак, есть XML приблизительно такого вида:

Код:

<elux>
  <!-- таблица  object -->
    <object>
        <object_id>1</object_id>
        <object_type>shop</object_type>
        <object_name>Орхидея</object_name>
        <object_address>ул. Марата, 7</object_address>
        <object_tel>3335676</object_tel>
        <object_services>доставка цветов, составление букетов, оформление и декорация помещений</object_services>
        <object_url>http://www.orhideja.ru</object_url>
        <object_piс>logo/3.gif</object_piс>
        <object_map_id>1</object_map_id>
        <object_map_x>1000</object_map_x>
        <object_map_y>1000</object_map_y>
        <object_info>Сейчас нам предстоит самая сложная задача в этом проекте — реализовать функцию-мозг, которая будет решать, в какую клетку нужно сделать ход. Первым шагом, который мы осуществим в этом направлении, станет создание переменных, хранящих маршрут обхода рядков для каждой клетки. Как вы помните, необходимо сделать оценку ценности позиции клетки относительно всех рядков, к которым она относится, а вывод сделать по их сумме. Конечно, можно попытаться написать и универсальный алгоритм, который сможет обходить все рядки, к которым принадлежит клетка, вне зависимости от ее положения. Но это слишком сложно для крестиков-ноликов и достойно скорее игры «Пять в ряд». Гораздо проще и быстрее будет перечислить в индивидуальной для каждой клетки переменной индексы клеток, образующих рядки, к которым она относится:</object_info>
        <object_foto1>foto/1.jpg</object_foto1>
        <object_foto2>foto/2.jpg</object_foto2>
        <object_foto3>foto/3.jpg</object_foto3>
        <object_time>с 10 до 18-30</object_time>
    </object>
    <object>
        <object_id>2</object_id>
        <object_type>shop</object_type>
        <object_name>Модница</object_name>
        <object_address>ул. Науки, 5</object_address>
        <object_tel>2340900</object_tel>
        <object_services>сумки из Италии</object_services>
        <object_url>http://www.italy.ru</object_url>
        <object_piс>logo/3.gif</object_piс>
        <object_map_id>2</object_map_id>
        <object_map_x>390</object_map_x>
        <object_map_y>700</object_map_y>
        <object_info>Станции превратились в города-государства, а в туннелях властвуют тьма и страх. Жители Севастопольской, маленькой подземной Спарты, ценой невероятных
усилий выживают на своей станции и обороняют ее. Но однажды Севастопольская оказывается отрезанной от большого метро, всем ее обитателям грозит страшная гибель. Чтобы спасти людей, нужен настоящий герой…
</object_info>
        <object_foto1>foto/4.jpg</object_foto1>
        <object_foto2>foto/5.jpg</object_foto2>
        <object_foto3>foto/6.jpg</object_foto3>
        <object_time>с 10 до 19</object_time>
    </object>
...

Есть кнопки с алфавитом - русским и английским(по 2-3 буквы на кнопку). При нажатии на кнопку на сцене отображаются все объекты, с названием, начинающимся на соответствующую букву. Проблема в том, что они отображаются в том порядке, в котором записаны в XML. Т.е. не происходит сортировки по алфавиту - простая выборка, и названия на Б оказываются раньше названий на А, если в XML они встречаются раньше.

Внизу привожу кусок кода, который отвечает за выборку. Сначала выборка по "типу". Если язык не выбран - подгружаются все объекты, если русский или английский - то по буквам.
Необходимо, чтобы на экране все было по алфавиту

Код AS1/AS2:

        for (var i = 0; i < elux.firstChild.childNodes.length; i++)
        {
 
                var i_name = new Array ();
                i_name[i] = o_name[i].split ("");
 
                if (o_type[i] == "avto")
                {
                        if (ru_eng == "all")
                        {
                                otrisovka(o_name[i],o_address[i],o_tel[i],o_services[i],o_info[i],o_foto1[i],o_foto2[i],o_foto3[i],o_pic[i],o_time[i],o_url[i]);
                        }
                        else if (ru_eng == "rus")
                        {
                                if ((i_name[i][0] == t1) or (i_name[i][0] == t2) or (i_name[i][0] == t3))
                                {
                                        trace (o_name[i]);
                                        otrisovka(o_name[i],o_address[i],o_tel[i],o_services[i],o_info[i],o_foto1[i],o_foto2[i],o_foto3[i],o_pic[i],o_time[i],o_url[i]);
                                }
                                else
                                {
                                        //trace("NO  " + i_name[i][0]);
                                }
                        }
                        else if (ru_eng = "eng")
                        {
                                if ((i_name[i][0] == r1) or (i_name[i][0] == r2))
                                {
                                        trace (o_name[i]);
                                        otrisovka(o_name[i],o_address[i],o_tel[i],o_services[i],o_info[i],o_foto1[i],o_foto2[i],o_foto3[i],o_pic[i],o_time[i],o_url[i]);
                                }
                                else
                                {
                                }
                        }
                        else
                        {
                        }
                }
                else
                {
                }
        }


Эм... Хорошо, что вы не видите, что я там, бывает, в инфо пишу... Базы как таковой еще нет, а искать реальную информацию лениво :)

Добавлено через 4 минуты
Если не знаешь, как делать в принципе - читаешь литературу, копаешься на форумах - и узнаешь. Учиться, бывает, интересно...

Mnilionic 30.07.2009 21:23

реально:
Код AS1/AS2:

var xml:XML = new XML();
xml.ignoreWhite = true;
xml.onLoad = function(flag:Boolean){
        if(!flag){ trace('no such file'); return; }
        convert();
        // поле по которому сортируем
        sorting('object_name', false);
}
xml.load('your.xml');
 
var data = new Array();
function convert(){
        var box= xml.firstChild.firstChild;
        while(box){
                var item:Object = new Object();
                var prop = box.firstChild;
                while(prop){
                        item[prop.nodeName] = prop.firstChild.nodeValue;
                        prop = prop.nextSibling;
                }
                data.push(item);
                box = box.nextSibling;
        }
}
 
function sorting(field:String, desc:Boolean){
        test_trace()
        if(desc)
                data.sortOn([field], Array.DESCENDING );
        else
                data.sortOn([field]);
        test_trace()
}
 
// тустовый вывод
function test_trace(){
        trace( data[0].object_id+ '| ' +data[0].object_name);
        trace( data[1].object_id+ '| ' +data[1].object_name);
        trace( '--------');
}

но лучше, конечно, большие данные подготвливать в другой среде


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

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