Ir para conteúdo

POWERED BY:

Arquivado

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

Blade Skywalker

Ordenação em java

Recommended Posts

Olá todos.

 

Eu gostaria de saber como eu uso o metodo Sort() em java para organizar um array de um modo bem especial. É o seguinte:

 

Ao contrario do Arrays.Sort(arrayqualquer) que organiza os elementos do array de acordo com o código ASCII (numeros vem antes de letras), eu gostaria de organizar o meu array onde numeros vem depois de letras. Eu sei que existe o sort:

 

public static <T> void sort(T[] a, Comparator<? super T> c)

 

Por favor, preciso da solução urgentemente, se possivel!

 

Grato!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O prórprio método te diz como fazer.

O comparator passado a ele que vai definir a sortOrder.

Portanto...implemente um comparator de forma que seu método compare defina a ordem do sort que quer.

Exemplo:

meuComparator.java:

package app;
import Java.util.Comparator;

/*fazer uma implementação melhor*/
public class meuComparator
implements Comparator<String>
{
	public int compare(String o1, String o2) {
		try {
			Integer.parseInt(o1);
			return 1;
		} catch(NumberFormatException e){
			try {
				Integer.parseInt(o2);
				return -1;
			} catch(NumberFormatException e1){
				return o1.compareTo(o2);
			}
		}
	}
}

Main.java:

package app;

import java.util.List;
import java.util.ArrayList;

public class Main {
	public static void main(String[] args) {
		List<String> sl = new ArrayList<String>();
		sl.add("10");
		sl.add("d");
		sl.add("b");
		sl.add("a");
		sl.add("5");
		meuComparator c = new meuComparator();
		java.util.Collections.sort(sl, c);
		int size = sl.size();
		for(int i = 0;i < size;i++){
			System.out.println("Sl[" + i + "] = " + sl.get(i));
		}
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu cara, pela sua resposta! Esclareceu a mim como funciona o comparator.

Contudo, há alguns problemas quanto ao seu código. Ele não organiza os numeros em ordem numerica decrescente e não verifica se há digito com letra juntos (por exemplo, 1c, 12ad). Este ultimo eu modifiquei o código, colocando para verificar apenas o primeiro caractere da string. Mas teve uma coisa que eu ainda não consegui implementar:

 

Caso seja inserida uma string tipo "Eu vou 1psd 1asd 1dff"

o retorno deve ser:

 

Eu

vou

1asd

1dff

1psd

 

Ou seja, igualzinho a ordem do código ASCII, só que invertido! É como se eu tivesse que organizar meu array normalmente (com o sort), parti-lo em 2 até onde tiver numeros no inicio e "colar" essa primeira parte no final.

Se alguem puder me ajudar com essa parte, eu agradeceria (só falta isso pra terminar o trabalho =P).

Compartilhar este post


Link para o post
Compartilhar em outros sites

A sim...desculpe.

Correção:

 

Comparator.java:

package app;
import Java.util.Comparator;

/*fazer uma implementação melhor*/
public class meuComparator
implements Comparator<String>
{
	public int compare(String o1, String o2) {
		o2 = o2.replaceAll("^([0-9]).*$", "$1");
		o1 = o1.replaceAll("^([0-9]).*$", "$1");
		try {
			Integer.parseInt(o1);
			return 1;
		} catch(NumberFormatException e){
			try {
				Integer.parseInt(o2);
				return -1;
			} catch(NumberFormatException e1){
				return o1.compareTo(o2);
			}
		}
	}
}

Main.java:

package app;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		String algo = "d 5abc a j";
		List<String> sl = new ArrayList(Arrays.asList((Object[])algo.split(" ")));
		meuComparator c = new meuComparator();
		java.util.Collections.sort(sl, c);
		int size = sl.size();
		for(int i = 0;i < size;i++){
			System.out.println("Sl[" + i + "] = " + sl.get(i));
		}
	}
}

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.