¿Por qué Java SortedSet puede lograr la clasificación automática?

SortedSet en Set (SortedSet es la interfaz de implementación de TreeSet), la relación de herencia entre ellos es la siguiente:

java.util.Set;

java.util.SortedSet; 

java.util.TreeSet; 

Los elementos en SortedSet no están ordenados y no se pueden repetir, pero los elementos almacenados se pueden ordenar automáticamente en orden de tamaño del elemento. Combinado con el siguiente código:

 

import java.util.*;
import java.text.*;
public class SortedSetTest01{
 public static void main(String[] args)throws Exception{
   SortedSet ss=new TreeSet();
   //数字类
   ss.add(12);
   ss.add(23);
   ss.add(45);
   ss.add(39);
   ss.add(45);
   Iterator it=ss.iterator();
   while(it.hasNext()){
     System.out.println(it.next());
   }
   //String类
   SortedSet str=new TreeSet();
   str.add("JACK");
   str.add("TOM");
   str.add("KING");
   str.add("SUN");
   it=str.iterator();
   while(it.hasNext()){
     System.out.println(it.next());
   }
   //日期类
   String st1="2003-08-12";
   String st2="2004-09-17";
   String st3="2003-04-12";
   String st4="2013-09-04";
   
   SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
   Date t1=sdf.parse(st1);
   Date t2=sdf.parse(st2);
   Date t3=sdf.parse(st3);
   Date t4=sdf.parse(st4);
   
   SortedSet times=new TreeSet();
   times.add(t1);
   times.add(t2);
   times.add(t3);
   times.add(t4);
   
   it=times.iterator();
   while(it.hasNext()){
     Object element=it.next();
     if(element instanceof Date){
       Date d=(Date)element;
       System.out.println(sdf.format(d));
     }
   }
 }
}

 

Salida después de compilar y ejecutar:

 

12
23
39
45
JACK
KING
SUN
TOM
2003-04-12
2003-08-12
2004-09-17
2013-09-04

 

El código anterior muestra que los elementos almacenados en SortedSet se pueden ordenar según el tamaño del elemento, que puede ser numérico, de cadena o de fecha. Ahora que conoce esta característica de SortedSet, ¿por qué los elementos de almacenamiento de la colección SortedSet se pueden ordenar automáticamente?

 

En el código anterior, hemos implementado la ordenación automática de los números, cadenas y fechas en SortedSet, luego, si personalizamos varios objetos de tipo Usuario y luego los agregamos a la colección SortedSet, podemos lograr el automático como el anterior Ordenar? Pruébalo

 

import java.util.*;
public class SortedSetTest02{
 public static void main(String[] args){
   SortedSet users=new TreeSet();
   User u1=new User(12);
   User u2=new User(16);
   User u3=new User(23);
   User u4=new User(32);
   User u5=new User(43);
   
   users.add(u1);
   users.add(u2);
   users.add(u3);
   users.add(u4);
   users.add(u5);
   Iterator it=users.iterator();
   while(it.hasNext()){
     System.out.println(it.next());
   }
 }
}
class User{
 int age;
 User(int age){
   this.age=age;
 }
 public String toString(){
   return "User[age="+age+"]";
 }
}

 

Compilar y pasar, error después de ejecutar, salida:

Excepción en el hilo "principal" java.lang.ClassCastException: el usuario no puede ser enviado a java.lang.Comparable

en java.util.TreeMap.compare (fuente desconocida)

en java.util.TreeMap.put (fuente desconocida)

en java.util.TreeSet.add (fuente desconocida)

en SortedSetTest02.main (SortedSetTest02.java:14)

El usuario no se puede convertir a java.lang.Comparable, lo que significa que el usuario no se puede convertir a un tipo comparable. Por lo tanto, el Usuario debe implementar la interfaz Comparable (es decir, el número, la cadena y la fecha en el primer ejemplo de programa ya han implementado la interfaz Comparable), que es la clase El usuario implementa Comparable {}. Sabemos que una clase que implementa una interfaz implementa todos los métodos de esta interfaz. La razón por la cual los elementos en la colección SortedSet se pueden ordenar automáticamente es porque los elementos agregados usando el método add () implementan el método CompareTo () en la interfaz Comparable.

En el código anterior, si damos un requisito, ordenado según la edad del Usuario, entonces necesitamos escribir una regla de comparación,

 

public int compareTo(Object o){
   //编写一个比较规则
   int age1=this.age;
   int age2=((User)o).age;
   return age1-age2;
 }

 

El uso de compareTo es u1.compareTo (u2), esto es u1, el parámetro o entre paréntesis es u2, porque el tipo de parámetro entre paréntesis es Tipo de objeto y el tipo de Objeto no tiene atributo de edad, por lo que debe convertir o al Usuario Escriba, (Usuario) o. El código general después de la modificación es el siguiente:

 

import java.util.*;
public class SortedSetTest02{
 public static void main(String[] args){
   SortedSet users=new TreeSet();
   User u1=new User(12);
   User u2=new User(16);
   User u3=new User(23);
   User u4=new User(32);
   User u5=new User(43);
   
   users.add(u1);
   users.add(u2);
   users.add(u3);
   users.add(u4);
   users.add(u5);
   Iterator it=users.iterator();
   while(it.hasNext()){
     System.out.println(it.next());
   }
 }
}
class User implements Comparable{
 int age;
 User(int age){
   this.age=age;
 }
 public String toString(){
   return "User[age="+age+"]";
 }
 //实现java.lang.Comparable;接口中的compareTo方法
 //该方法程序员负责实现,SUN提供的程序已经调用了该方法
 //需求:按照User的年龄排序
 public int compareTo(Object o){  //u1.compareTo(u2)
   //编写一个比较规则
   int age1=this.age;   
   int age2=((User)o).age;
   return age1-age2;
 }
}

 

Salida después de compilar y ejecutar:

 

User[age=12]
User[age=16]
User[age=23]
User[age=32]
User[age=43]

 

Además, hay otra forma de ordenar las colecciones SortedSet: use java.util.Comparator; para escribir un comparador por separado, que se proporciona al crear una colección TreeSet, a saber, productos SortedSet = new TreeSet (new ProductComparator ( )); El código es el siguiente:

 

import java.util.*;
public class SortedSetTest03{
 public static void main(String[] args){
   //创建TreeSet集合的时候提供一个比较器
   SortedSet products=new TreeSet(new ProductComparator());
   Product p1=new Product(3.4);
   Product p2=new Product(4.0);
   Product p3=new Product(3.6);
   Product p4=new Product(7.6);
   Product p5=new Product(3.7);
   
   products.add(p1);
   products.add(p2);
   products.add(p3);
   products.add(p4);
   products.add(p5);
   
   Iterator it=products.iterator();
   while(it.hasNext()){
     System.out.println(it.next());
     }
 }
}
class Product{
 double price;
 Product(double price){
   this.price=price;
 }
 public String toString(){
   return price + "";
 }
}
//单独编写一个比较器
class ProductComparator implements Comparator{
 //需求:按照商品价格排序
 public int compare(Object o1,Object o2){
   double price1=((Product)o1).price;
   double price2=((Product)o2).price;
   if (price1==price2){
     return 0;
   }else if(price1>price2){
     return -1;
   }
   return 1;
 }
}

 

Salida después de compilar y ejecutar:

 

7.6
4.0
3.7
3.6
3.4

wx busca "koala programador", concéntrate en el campo de java, ¡un número público que crece contigo!

13 artículos originales publicados · Me gusta2 · Visitas 576

Supongo que te gusta

Origin blog.csdn.net/weixin_40273144/article/details/105659023
Recomendado
Clasificación