четверг, 17 февраля 2011 г.

Сортировка массива объектов по нескольким полям

Сортировка массива объектов по нескольким полям:

Иногда возникает необходимость отсортировать некоторый массив объектов сразу по нескольким полям. Например, есть список пользователей. Каждый из них в текущий момент может быть в онлайне. Наша задача - отсортировать список таким образом, чтобы сначала показывались по алфавиту пользователи в онлайне, а за ними - те, кто в оффлайне. Это можно сделать так:

 
package {
import flash.display.Sprite;
import flash.utils.getTimer;
 
public class VectorSorting extends Sprite {
 
    private var players:Vector.<Player> = new Vector.<Player>();
 
    public function VectorSorting() {
        // Заполняем массив данными
        addPlayers(50);
 
        // Выводим начальный массив
        playersTrace();
 
        // Засекаем время
        var current:int = getTimer();
 
        // Cортируем массив
        players.sort(
            function(a:Player, b:Player):Number {
                if (a.online == b.online) {
                    return a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;
                } else {
                    return a.online ? -1 : 1;
                }
            }
        );
 
        // Выводим время, затраченное на выполнение сортировки
        trace("Сортировка заняла",String(getTimer()-current),"миллисекунд");
 
        // Выводим отсортированный массив
        playersTrace();
    }
 
    /**
     * Вывод содержимого массива
     */
    private function playersTrace():void {
        trace("--------------------------");
        for each (var player:Player in players) {
            trace(player.toString());
        }
        trace("--------------------------");
    }
 
    /**
     * Заполнение массива начальными данными
     */
    private function addPlayers(numPlayers:int):void {
        for (var i:int = 0; i < numPlayers; i++) {
            var rName:String = "Player " + String(int(Math.random() * 100));
            var rOnline:Boolean = Boolean(Math.random() > .5);
            var currentPlayer:Player = new Player(i, rName, rOnline);
            players.push(currentPlayer);
        }
    }
}
}
 
class Player {
    public var id:int;
    public var name:String;
    public var online:Boolean;
 
    public function Player(id:int, name:String, online:Boolean) {
        this.id = id;
        this.name = name;
        this.online = online;
    }
 
    public function toString():String {
        return "Player{id="+String(id)+",name="+String(name)+",online="+String(online)+"}";
    }
}

Комментариев нет:

Отправить комментарий