Pesquisa de Strings[RESOLVIDO]

16 respostas
R

Bom dia tenho uma duvída. Eu tenho que fazer uma pesquisa de Strings, ela vem ordenada por padrão assim Alpha 100, Alpha 2, Alpha 200, Alpha 2A, Alpha 2A-8000, Alpha 2A-900
e eu gostaria de ordenar assim Alpha 2, Alpha 2A, Alpha 2A-900, Alpha 2A-8000, Alpha 100, Alpha 200 mas eu não sei como fazer se alguém poder me ajudar. Agradeço.

16 Respostas

CyberX

Tentei dessa forma mas meu resultado foi : Alpha 100, Alpha 2A-8000, Alpha 2A-900, Alpha 200, Alpha 2, Alpha 2A.
Também gostaria de saber como solucionar esse problema.
Acho que deve ser por esse caminho.

public static void main(String args[]) {
		String [] strings = {"Alpha 100", "Alpha 2", "Alpha 200", "Alpha 2A", "Alpha 2A-8000", "Alpha 2A-900" };
		
		Collections.sort(Arrays.asList(strings), new Comparator<String>(){

			@Override
			public int compare(String s1, String s2) {
				if(s1.compareTo(s2) == -1)
					return -1;
				else if(s1.compareTo(s2) == 0)
					return 0;
				return 1;
			}
		});
		
		for (String s : strings) {
			System.out.print(s +", ");
		}
	}

CyberX.

nel

CyberX:
Tentei dessa forma mas meu resultado foi : Alpha 100, Alpha 2A-8000, Alpha 2A-900, Alpha 200, Alpha 2, Alpha 2A.
Também gostaria de saber como solucionar esse problema.
Acho que deve ser por esse caminho.

public static void main(String args[]) {
		String [] strings = {"Alpha 100", "Alpha 2", "Alpha 200", "Alpha 2A", "Alpha 2A-8000", "Alpha 2A-900" };
		
		Collections.sort(Arrays.asList(strings), new Comparator<String>(){

			@Override
			public int compare(String s1, String s2) {
				if(s1.compareTo(s2) == -1)
					return -1;
				else if(s1.compareTo(s2) == 0)
					return 0;
				return 1;
			}
		});
		
		for (String s : strings) {
			System.out.print(s +", ");
		}
	}

CyberX.

Campeão, não é mais fácil isso ?

String [] strings = {"Alpha 100", "Alpha 2", "Alpha 200", "Alpha 2A", "Alpha 2A-8000", "Alpha 2A-900" };
		
		Collections.sort(Arrays.asList(strings), new Comparator<String>(){

			@Override
			public int compare(String s1, String s2) {
				return s1.compareTo(s2);
			}
		});

Você fez algo assim: “se s1.compareTo(s2) for igual a -1, retorna menos -1”. Portanto, retornar diretamente o resultado é mais eficiente.
Infelizmente não posso testar os resultados agora, todavia, é implementar o comparator e buscar a solução adequada a sua necessidade.

CyberX

Fiz dessa forma e a saída foi a mesma que o robson18 informou.
Então por esse motivo fiz dessa outra forma.
Achei estranho mas não sei o porque isso aconteceu.

Voltando… Qual seria a melhor forma então para essa saída: Alpha 2, Alpha 2A, Alpha 2A-900, Alpha 2A-8000, Alpha 100, Alpha 200
Estou curioso para essa solução.

Luan_Kevin
public static void main(String[] args) {

		String[] strings = { "Alpha 100", "Alpha 2", "Alpha 200", "Alpha 2A",
				"Alpha 2A-8000", "Alpha 2A-900" };

		Collections.sort(Arrays.asList(strings), new Comparator<String>() {

			@Override
			public int compare(String s1, String s2) {
				return(s1.compareTo(s2));
				
			}
		});

		for (String s : strings) {
			System.out.print(s + ", ");
		}
	}

acho que isso resolve :thumbup:
espero ter ajudado!

CyberX

Read the First Post ^

Comparando dessa forma a saída é: Alpha 100, Alpha 2, Alpha 200, Alpha 2A, Alpha 2A-8000, Alpha 2A-900
que não é a saída que o Robson quer, mas a saída que ele quer é:
Alpha 2, Alpha 2A, Alpha 2A-900, Alpha 2A-8000, Alpha 100, Alpha 200

nel

CyberX:
Read the First Post ^

Comparando dessa forma a saída é: Alpha 100, Alpha 2, Alpha 200, Alpha 2A, Alpha 2A-8000, Alpha 2A-900
que não é a saída que o Robson quer, mas a saída que ele quer é:
Alpha 2, Alpha 2A, Alpha 2A-900, Alpha 2A-8000, Alpha 100, Alpha 200

Porque o comparator da String fez “correto”. Acontece, que o ele precisa é um outro modelo, portanto, cabe a ele decidir de que forma implementar isso ou sugestões.

R

Essa saída eu consegui antes e pedir ajuda Alpha 100, Alpha 2, Alpha 200, Alpha 2A, Alpha 2A-8000, Alpha 2A-900, mas
a saída certa eu não estou conseguindo. O meu professor deu essa dica. Quebre cada linha de entrada em um grupo de letras e um grupo de inteiros, e compare cada
grupo, linha a linha. Você pode dividir seu problema em problemas menores

CyberX

nel:
CyberX:
Read the First Post ^

Comparando dessa forma a saída é: Alpha 100, Alpha 2, Alpha 200, Alpha 2A, Alpha 2A-8000, Alpha 2A-900
que não é a saída que o Robson quer, mas a saída que ele quer é:
Alpha 2, Alpha 2A, Alpha 2A-900, Alpha 2A-8000, Alpha 100, Alpha 200

Porque o comparator da String fez “correto”. Acontece, que o ele precisa é um outro modelo, portanto, cabe a ele decidir de que forma implementar isso ou sugestões.

Ok !? Agora vem as perguntas… De que modelo ele precisa ? Como implementar ou que sugestão deve ser informada ?
Tem algum exemplo plausível para que possamos solucionar essa questão ?

Waiting…

CyberX

robson18:
Essa saída eu consegui antes e pedir ajuda Alpha 100, Alpha 2, Alpha 200, Alpha 2A, Alpha 2A-8000, Alpha 2A-900, mas
a saída certa eu não estou conseguindo. O meu professor deu essa dica. Quebre cada linha de entrada em um grupo de letras e um grupo de inteiros, e compare cada
grupo, linha a linha. Você pode dividir seu problema em problemas menores

Legal essa pode ser uma saída para o problema !

Encoding…

ul1sses

Qual a regra da ordenação? O que é define que um caractere ou palavra é “maior”/“menor” ou vem antes ou depois que a outra?

R

Cara eu fiz algo aqui... mas só só vai funciona se vc seguir o padrão:

o resto eu não garanto!

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;


public class MyComparator implements Comparator<String> {

	@Override
	public int compare(String arg0, String arg1) {

		if(arg0.contains("-") && arg1.contains("-")){
			
			String a[] = arg0.split("-");
			String b[] = arg1.split("-");
			
			if(a[0].equals(b[0])){
				int numA = Integer.parseInt(a[1]);
				int numB = Integer.parseInt(b[1]);
				
				if(numA < numB){
					return -1;
				}
				else if(numA == numB){
					return 0;
				}
				else{
					return 1;
				}
			}
		}
		
		if(arg0.contains(" ") && arg0.contains(" ")){
			String a[] = arg0.split(" ");
			String b[] = arg1.split(" ");
			
			if(a[0].equals(b[0])){
				
				try{
					int numA = Integer.parseInt(a[1]);
					int numB = Integer.parseInt(b[1]);
										
					if(numA < numB){
						return -1;
					}
					else if(numA == numB){
						return 0;
					}
					else{
						return 1;
					}
				}
				catch (Exception e) {
					if(arg0.contains("-") && arg0.contains("-")){
						return compare(arg0, arg1);
					}
					else {
						int comp = complexComparator(a[1], b[1]);
						if(0 == comp){
							return a[1].compareTo(b[1]);
						}
						return comp;
					}
				}
			}
		}
		
		return arg0.compareTo(arg1);
		
	}
	
	private int complexComparator(String arg0, String arg1){
		
		char a[] = arg0.toCharArray();
		char b[] = arg1.toCharArray();
		
		String temp = "";
		
		int numA = 0;
		int numB = 0;
		
		for (char c : a) {
			try{
				Integer.parseInt(c+"");
				temp += c;
			}catch (Exception e) {
				if(temp.length() > 0){
					numA = Integer.parseInt(temp);
					//System.out.println("Temp maior que 0 em A");
					
				}
				break;
			}
			finally{
				if(temp.length() > 0){
					numA = Integer.parseInt(temp);
				}
			}
		}
		
		temp = "";
		
		for (char c : b) {
			try{
				Integer.parseInt(c+"");
				temp += c;
			}catch (Exception e) {
				if(temp.length() > 0){
					numB = Integer.parseInt(temp);
					//System.out.println("Temp maior que 0 em B");
				}
				break;
			}
			finally{
				if(temp.length() > 0){
					numB = Integer.parseInt(temp);
				}
			}
		}
		
		//System.out.println("Complexo: " + arg0 + ": " + numA + " - " + arg1 + ": " + numB);
		
		return numA - numB;
		
	}

	public static void main(String[] args) {
		 String [] strings = {"Alpha 100", "Alpha 2", "Alpha 200", "Alpha 2A", "Alpha 2A-8000", "Alpha 2A-900" };
		 
		 Collections.sort(Arrays.asList(strings), new MyComparator());
		 
		 for (String string : strings) {
			System.out.println(string);
		}
	}
}
CyberX

É isso que estamos tentando descobrir.

Encoding…

CyberX

Rafael_Leal:
Cara eu fiz algo aqui… mas só só vai funciona se vc seguir o padrão:

<espaço> <ifém>

o resto eu não garanto!

LOK muito bom esse algoritmo, claro que seguindo essa linha de raciocínio lógico ’ <espaço> <ifém>

Vou dar uma estudada nessa algoritmo entender e usar para outras funções.

Congratulations [i]Rafael_Leal[/i]. Thanks for the help.

R

Cara era isso mesmo, os parametros da pesquisa eram só esses. Valew…

CyberX

Altere o status do seu post para [Resolvido] para ficar claro que sua dúvida foi sanada!

Tks.

R

Tinha um erro na linha 18… a segunda comparação do if tava errada! CORRIGI!!!

Criado 10 de abril de 2012
Ultima resposta 10 de abr. de 2012
Respostas 16
Participantes 6