Comparável
Comparável é a interface de classificação.
Se uma classe implementa a interface comparável, significa "esta classe suporta a classificação". Como as classes que implementam a classificação de suporte à interface comparável, assumindo que agora existe uma "lista de lista (ou matriz) de objetos de classes que implementam interface comparável", a lista de lista (ou matriz) pode ser classificada por coleções.Sort (ou Arrays.Sort).
Além disso, "Objeto da classe que implementa interface comparável" pode ser usado como uma chave em um "mapa ordenado (como o Treemap)" ou um elemento em um "conjunto ordenado (TreeSet)" sem especificar um comparador.
A interface comparável inclui apenas uma função, e sua definição é a seguinte:
pacote java.lang; importar java.util.*; interface pública comparável <t> {public int compare (t o);} Descrição: Suponha que "comparemos os tamanhos de X e Y" através do X.compareto (y). Se você retornar um "número negativo", significa "x é menor que Y"; Se você retornar um "zero", significa "x é igual a y"; Se você retornar um "número positivo", significa "x é maior que Y".
A interface comparável tem sido genérica; portanto, o objeto que implementa comparável declara que tipo ele pode ser comparado. (Geralmente, esse é o tipo de objeto em si, mas às vezes também pode ser uma classe pai.)
interface pública comparável {public boolean Compareto (t Outro); }
Portanto, a interface comparável contém um parâmetro de tipo t, que é o tipo de objeto com o qual uma classe que implementa comparável pode se comparar. Isso significa que, se você definir uma classe que implementa comparável, como string, você deve declarar não apenas a classe suporta comparação, mas também com o que ela pode comparar (geralmente a si mesma):
classe pública String implementa comparável {...}
Agora, vamos considerar a implementação de um método binário max (). Você deseja aceitar dois parâmetros do mesmo tipo, ambos são comparáveis e são comparáveis entre si. Felizmente, isso é bastante intuitivo se você usar métodos genéricos e parâmetros de tipo restrito:
public static> t max (t t1, t t2) {if (t1.compareto (t2)> 0) retornar t1; caso contrário, retorne T2; }
Neste exemplo, você define um método genérico que é generificado no Tipo T e restringe a extensão do tipo (implementação) comparável. Ambos os parâmetros devem ser do tipo T, o que significa que são do mesmo tipo, comparação de suporte e são comparáveis entre si. fácil!
Melhor ainda, o compilador usará o raciocínio do tipo para determinar o que o valor de t significa quando o max () é chamado. Portanto, não há necessidade de especificar T, a chamada a seguir funcionará:
String s = max ("moo", "casca");O compilador calculará que o valor predeterminado de t é string, portanto, executará a compilação e a verificação do tipo. Mas se você tentar ligar para o max () com argumentos para a classe X que não implementam, o compilador não permitirá isso.
Comparador
Comparador é a interface do comparador.
Se precisarmos controlar a ordem de uma determinada classe, que não suporta a classificação (ou seja, ela não implementa a interface comparável); Então podemos estabelecer um "comparador desta classe" para classificar. Esse "comparador" precisa apenas implementar a interface do comparador.
Ou seja, podemos criar um novo comparador "Implementando a classe Comparadora" e depois classificar a classe através do comparador.
A interface do comparador inclui apenas duas funções, e sua definição é a seguinte:
pacote java.util; comparador de interface pública <t> {int compare (t o1, t o2); boolean é igual (objeto obj);} ilustrar:
1. Se uma classe desejar implementar a interface do comparador: deve implementar a função Compareto (T O1, T O2), mas pode não implementar a função Equals (Object Obj).
Por que não podemos implementar a função igual (objeto obj)? Porque, por padrão, o igual (objeto obj) foi implementado. Todas as classes em Java são herdadas de java.lang.Object, e a função Equals (Object Obj) é implementada em object.java; Portanto, todas as outras classes são equivalentes à implementação dessa função.
2.Int Compare (T O1, T O2) é "Compare os tamanhos de O1 e O2". Retornar "número negativo" significa "O1 é menor que o O2"; retornar "zero", que significa "O1 é igual a O2"; retornar "número positivo" significa "O1 é maior que O2".
Comparador e comparável
Comparável é uma interface de classificação; Se uma classe implementa uma interface comparável, significa "esta classe suporta a classificação".
Comparador é um comparador; Se precisarmos controlar a ordem de uma determinada classe, podemos estabelecer um "comparador dessa classe" para classificá -la.
Não é difícil descobrir que comparável é equivalente a um "comparador interno", enquanto o comparador é equivalente a um "comparador externo".
Usamos um programa de teste para ilustrar essas duas interfaces. O código -fonte é o seguinte:
importar java.util.*; importar java.lang.comparable;/*** @DESC Programa de comparação entre "comparador" e "comparável". * (01) "Comparável" * É uma interface de classificação que contém apenas uma função compareto (). * Uma classe implementa a interface comparável, o que significa "a própria classe suporta a classificação", que pode ser classificada diretamente através de Arrays.sort () ou coleções.sort (). * (02) "Comparador" * é uma interface comparadora, incluindo duas funções: compare () e iguals (). * Uma classe implementa a interface do comparador, então é um "comparador". Outras classes podem ser classificadas de acordo com o comparador. * * Para resumir: Comparável é um comparador interno, enquanto o comparador é um comparador externo. * Uma classe em si implementa um comparador comparável, o que significa que ele suporta a classificação; Se não implementar a si mesma comparável, também poderá ser classificado através do comparador do comparador externo. */public class ComparecomParatorAndComParableTest {public static void main (string [] args) {// Crie um novo ArrayList (Array Dynamic) ArrayList <S Pessoa> LIST = new ArrayList <Pesso> (); // Adicione um objeto à lista da ArrayList.Add (New Pessoa ("CCC", 20)); list.add (nova pessoa ("aaa", 30)); list.add (nova pessoa ("bbb", 10)); list.add (nova pessoa ("DDD", 40)); // imprima a sequência original do list System.out.printf ("Original Smip, List:%s/n", lista); // Classifique a lista // aqui ela será classificada de acordo com a "interface comparável <string> implementada por pessoa", ou seja, classificada de acordo com "Name", coleções.sort (list); System.out.printf ("Classificação de nome, lista:%s/n", lista); // Classifique a lista através do "Comparador (ascagecomparator)" // O método de classificação do ascagecomparator é: classificado de acordo com a ordem ascendente da "idade". System.out.printf ("ASC (AGE), Lista:%s/n", lista); // Classifique a lista através de "Comparador (DescageComParator)". // O método de classificação do descendente é: classificar de acordo com a ordem descendente da "idade". System.out.printf ("Desc (idade), lista:%s/n", lista); // determinar se as duas pessoas são iguais testequals (); } /*** @DESC Teste se as duas pessoas são iguais. * Como a pessoa implementa a função Equals (): se a idade e o nome das duas pessoas forem iguais, as duas pessoas serão consideradas iguais. * Então, aqui P1 e P2 são iguais. * * TODO: Se a função Equals () for removida, o P1 não é igual a P2 */ private estático void testequals () {Pessoa P1 = nova pessoa ("eee", 100); Pessoa P2 = nova pessoa ("Eee", 100); if (p1.equals (p2)) {System.out.printf (" %s igual a %s/n", p1, p2); } else {System.out.printf (" %s não é igual a %s/n", p1, p2); }} /*** @DESC Pessoa classe. * A pessoa implementa a interface comparável, o que significa que a própria pessoa apóia a classificação*/ a pessoa estática privada implementa comparável a <Pessoa> {int Age; Nome da string; Pessoa pública (nome da string, Int Age) {this.name = name; this.age = idade; } public string getName () {return name; } public int getage () {Age de retorno; } public string tostring () {retorna nome + " -" + idade; } / *** Compare se duas pessoas são iguais: se o nome e a idade são iguais, elas são consideradas iguais* / booleanas iguais (pessoa pessoa) {if (this.age == Person.age && this.name == Person.name) Return true; retornar falso; } /*** @DESC Implemente a interface de "Comparável <string>", ou seja, reescreva a função compareto <Tt>. * Aqui está uma comparação pelo "nome da pessoa"*/ @Override public int compareto (pessoa pessoa) {retorna name.comPareto (Person.name); // return this.name - Person.name; }} / *** @Desc Comparador de ascagecomparator* É "Comparador ascendente da idade da pessoa"* / classe estática privada ascagecomparator implementa comparador <SOmest> {@Override public Int Compare (Pessoa P1, Pessoa P2) {return P1.Getage () - P2.GETAGE (); }} / *** @Desc Comparador descepomparator* É "Comparador ascendente da idade da pessoa"* / classe estática privada descegecomparator implementa o comparador <Desson> {@Override public Int Compare (Pessoa P1, Pessoa P2) {return p2.Getage () - P1.GETAGE (); }}} A seguir, é apresentada uma explicação deste programa.
1. Definição da classe Pessoa. do seguinte modo:
Pessoa de classe estática privada implementa comparável <Person> {int Age; Nome da string; ... /*** @Desc implementa a interface de "Comparável <string>", ou seja, substituir a função compareto <tt>. * Aqui está uma comparação pelo "nome da pessoa"*/ @Override public int compareto (pessoa pessoa) {retorna name.comPareto (Person.name); // return this.name - Person.name; }} ilustrar:
(1) A classe de pessoa representa uma pessoa. Existem dois atributos na classe Perong: idade (idade) e nome "Nome da pessoa".
(2) A classe pessoa implementa a interface comparável, para que possa ser classificada.
2. Em Main (), criamos a matriz de lista da pessoa (lista). do seguinte modo:
// Crie um novo ArrayList (Array Dynamic) ArrayList <Soper> List = new ArrayList <Soper> (); // Adicione um objeto ao ArrayList List.add (New Pessoa ("CCC", 20); List.add (New Pessoa ("AAA", 30)); List.dd (nova ("BB" ", 10); 3. Em seguida, imprimimos todos os elementos da lista. do seguinte modo:
// imprima a sequência original do list System.out.printf ("Classificação original, lista:%s/n", lista); 4. Em seguida, classificamos a lista através da função Sort () das coleções.
Como a pessoa implementa a interface comparável, ao classificar através de classificação (), ela será classificada de acordo com o método de classificação suportado pela pessoa, ou seja, as regras definidas por compareto (pessoa da pessoa). do seguinte modo:
// Classifique a lista // aqui, classificaremos de acordo com a "interface comparável <string> implementada por pessoa", isto é, classificando de acordo com "name" collects.sort (list); System.out.printf ("Classificação de nome, lista:%s/n", lista); 5. Comparável e comparador
Definimos dois comparadores, ascagecomparator e o separador descendente, para ascender e diminuir a pessoa de ordem, respectivamente.
6.CaGecomParator Comparador Classifica a pessoa em ordem ascendente por idade. O código é o seguinte:
/*** @DESC Comparador de ascagecomparator* É "Comparador ascendente da idade da pessoa"*/classe estática privada Ascagecomparator implementa comparador <sesson> {@Override public Int Compare (Pessoa P1, Pessoa P2) {return p1gage () - p2.Getage (); }} 7.DescageComparator Comparador Classifica a pessoa em ordem descendente por idade. O código é o seguinte:
/*** @Desc Comparador do DescaGecomParator* É "Comparador ascendente da idade da pessoa"*/classe estática privada Descendente doparator implementa o comparador <SOYSE> {@Override public Int Compare (Pessoa P1, Pessoa P2) {return p2.getage () - p1.getage (); }} 8. Execute o programa como resultado, a saída é a seguinte:
Classificação original, Lista: [CCC - 20, AAA - 30, BBB - 10, DDD - 40] Classificação de nome, Lista: [AAA - 30, BBB - 10, CCC - 20, DDD - 40] ASC (AGE), Lista: [BBB - 10, CCC - 20, AAA - 30, DD -40] 20, BBB - 10] EEE - 100 EAME EEE - 100