Иногда возникает необходимость отсортировать некоторый массив объектов сразу по нескольким полям. Например, есть список пользователей. Каждый из них в текущий момент может быть в онлайне. Наша задача - отсортировать список таким образом, чтобы сначала показывались по алфавиту пользователи в онлайне, а за ними - те, кто в оффлайне. Это можно сделать так:
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)+"}"; } }
Комментариев нет:
Отправить комментарий