Comparator<String>

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?

cabeludo mesmo, nao consegui entender isso…

  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.

[quote=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.

[/quote]

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

cai sim eduacsp…esse é o nivel da prova.

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:

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

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:

[code]
        public int compare(String s1,String s2){  
             return s2.charAt(1) - s1.charAt(1);  
        }  
[/code]

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).

 [code]
       Arrays.sort(words,best); 
 [/code]      

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.