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