Comparator<String>

5 respostas
J

Pessoal,

Tenho essa questão:

package com.sun.masterexam;

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

class Comp2{
	public static void main(String[] args){
		String[] words = {"Good","Bad","Ugly"};
		Comparator<String> best = new Comparator<String>(){
			public int compare(String s1,String s2){
				return s2.charAt(1) - s1.charAt(1);
			}
		};
		Arrays.sort(words,best);
		System.out.println(words[0]);
	}
}

O resultado é Good. Eu sinceramente não entendi pq deu esse resultado.
1-O que é inserido nos parâmetros de entrada s1 e s2?
2-O que o best retorna? eu debugei e ele só retorno um objeto (Comp2$1@17471e0). O correto é que retornasse um int positivo ou int negativo ou zero.
3-E o mais importante, esse tipo de questão cabeluda cai no SCJP 1.5?

5 Respostas

F

cabeludo mesmo, nao consegui entender isso…

T
  1. Esse comparator compara 2 strings, de forma que elas sejam ordenadas de forma decrescente e pela sua SEGUNDA letra (não se esqueça: charAt (1) retorna a segunda letra. )

No seu caso, a ordenação do array vai ficar “Good”, “Ugly” e “Bad” porque ele só olha a segunda letra (“o”, “g” e “a”).

  1. Nos parâmetros s1 e s2, vão os elementos a serem comparados pelo algoritmo de ordenação (ou seja, as strings).

  2. o objeto “best” é um Comparator, que é um objeto cuja única função na vida é fornecer um método “compare”. Se você já trabalhou com delegates em .NET vai reconhecer a semelhança, ou ponteiros de função em C/C++, vai reconhecer a semelhança. O objeto “best”, em si, não retorna 0, ou um inteiro menor ou maior que zero (não é -1 ou +1 como você está pensando). Quem retorna 0, ou um inteiro menor ou maior que zero, é o método “compare” desse objeto.

Esquisito, não? Mas esse é o mundo Java.

J

thingol:
0) Esse comparator compara 2 strings, de forma que elas sejam ordenadas de forma decrescente e pela sua SEGUNDA letra (não se esqueça: charAt (1) retorna a segunda letra. )

No seu caso, a ordenação do array vai ficar “Good”, “Ugly” e “Bad” porque ele só olha a segunda letra (“o”, “g” e “a”).

  1. Nos parâmetros s1 e s2, vão os elementos a serem comparados pelo algoritmo de ordenação (ou seja, as strings).

  2. o objeto “best” é um Comparator, que é um objeto cuja única função na vida é fornecer um método “compare”. Se você já trabalhou com delegates em .NET vai reconhecer a semelhança, ou ponteiros de função em C/C++, vai reconhecer a semelhança. O objeto “best”, em si, não retorna 0, ou um inteiro menor ou maior que zero (não é -1 ou +1 como você está pensando). Quem retorna 0, ou um inteiro menor ou maior que zero, é o método “compare” desse objeto.

Esquisito, não? Mas esse é o mundo Java.

ok…mas esse tipo de “coisa” cai no exame?

S

cai sim eduacsp…esse é o nivel da prova.

R

# package com.sun.masterexam;
#
# import java.util.Arrays;
# import java.util.Comparator;
#
# class Comp2{
# public static void main(String[] args){
# String[] words = {"Good","Bad","Ugly"};
# Comparator best = new Comparator(){
# public int compare(String s1,String s2){
# return s2.charAt(1) - s1.charAt(1);
# }
# };
# Arrays.sort(words,best);
# System.out.println(words[0]);
# }

E aí, blz ?

Essa pergunta é meio estranha mesmo, mas é que involve uma série de conceitos que precisamos entender.

Vamos tentar ver o que acontece :

Temos esse array:

String[] words = {"Good","Bad","Ugly"};

Neste ponto, ele NÃO ESTÁ CLASSIFICADO, porém, queremos classificá-lo, e para isso, usaremos a interface java.util.Comparator (Estudar java.lang.Comparable e java.util.Comparator).

Neste método que sobrescrevemos é que está o segredo:
public int compare(String s1,String s2){  
                 return s2.charAt(1) - s1.charAt(1);  
            }

Se prestarmos bastante atenção, podemos ver que ele está comparando o SEGUNDO ARGUMENTO com o PRIMEIRO, ou seja, EM ORDEM INVERTIDA, e notamos também que o parâmetro de comparação é a SEGUNDA LETRA (índice de arrays começam pelo 0).

Arrays.sort(words,best);
O produto desse processamento só pode ser um array ordenado inversamente.

(Precisamos saber que o ordenamento por odem natural seria Bad-Ugly-Good por que A vem antes de G e O vem depois de G).

Como comparamos ao contrário, basta inverter a ordem do array, que ficará assim:

Good-Ugly-Bad

System.out.println(words[0]);

Logo, quando exibirmos o primeiro elemento do array (0), então surgirá a string "Good".

Essa parte precisa ser estudada com muita atenção e de um tempinho para cair a ficha.

Espero ter ajudado !

Grando abraço,
Até Logo,
Rodrigo Lopes.

Criado 29 de outubro de 2008
Ultima resposta 30 de out. de 2008
Respostas 5
Participantes 5