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

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

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

package {
import flash.display.Sprite;
import flash.utils.getTimer;

public class VectorSorting extends Sprite {

    private var players:Vector. = new Vector.();

    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)+"}";
    }
}
  1. max
    3 октября 2011 в 18:19 | #1

    Спасибо, пригодилось =)

  1. Пока что нет уведомлений.