Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

lucas_bwd

[Resolvido]Array.sorton()

Recommended Posts

Ae galera,

 

Bem simples: Eu tenho um jogo com um ranking que é um array que contem os seguintes atributos: gols e tempo. A idéia é que o primeiro critério de ranking é o numero de gols e que o segundo critério é o tempo. O lance é que o número de gols tem que ser decrescente e o tempo crescente (quem marcou mais gols em menos tempo, sendo o menor tempo criterio de desempate).

 

Algo assim:

 

array[0] = {gols:15, tempo:15};
array[0] = {gols:15, tempo:20};
array[0] = {gols:12, tempo:30};
array[0] = {gols:10, tempo:5};

Isso é salvo em um XML então a ordem la ta bagunçada e tem que ser ordenada no flash. Eu to usando a função sortOn que funciona parcialmente:

 

ranking.sortOn(["goals", "time"], Array.NUMERIC | Array.DESCENDING);

Ele funciona pra ordenar pelo número de gols, mas o tempo também é decrescente. Então o cara que fez 15 gols em 20 segundos é melhor rankeado que o que fez 15 gols em 15 segundos, o que tá errado. Então eu preciso de um segundo critério de ordenação pro segundo campo.

 

Alguma idéia?

 

Lucas

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui colega:

var array:Array = new Array();

array.push({gols:15, tempo:15});
array.push({gols:15, tempo:20});
array.push({gols:12, tempo:30});
array.push({gols:10, tempo:5});

function order(a, b,c,d):Number {
	var tempo1:String = a.tempo;
	var tempo2:String = b.tempo;
	var gol1:String = c.gols;
	var gol2:String = d.gols;
	if (gol1<gol2) {
		if (tempo1<tempo2) {
			return -1;
		}else if (tempo1>tempo2) {
			return 1;
		}else {
			return 0;
		}
	} else if (gol1>gol2) {
		return 1;
	} else {
		return 0;
	}
}

array.sort(order);

for(i=0;i<array.length;i++){
	trace("Gols: " + array[i].gols +", Tempo: "+ array[i].tempo)
}

//Output
/*
Gols: 15, Tempo: 15
Gols: 15, Tempo: 20
Gols: 12, Tempo: 30
Gols: 10, Tempo: 5
*/

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala cara,

 

Tive que mudar um pouquinho a função, mas tu deu a luz. Valeu. Pra quem precisar aí algo parecido.

 

function sortGoals(a:Object, b:Object):Number
{
	var time1:uint = a.time;
	var time2:uint = b.time;
	var score1:uint = a.goals;
	var score2:uint = b.goals;

	if(score1 < score2)
	{
		return 1;
	}
	else if(score1 > score2)
	{
		return -1;
	}
	else
	{
		if(time1 < time2)
		{
			return -1;
		}
		else if(time1 > time2)
		{
			return 1;
		}
		else
		{
			return 0;
		}
	}
}

ranking.sort(sortGoals);

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.