JAVA ------ TreeSet of Collection

Características de la colección TreeSet

  1. Los elementos están ordenados. El orden aquí no se refiere al orden de almacenamiento y recuperación, sino que se clasifica de acuerdo con ciertas reglas. El método de clasificación específico depende del método de construcción

  2. TreeSet (): ordena según el orden natural de sus elementos

  3. TreeSet (comparador comparador): ordenar de acuerdo con el comparador especificado

  4. No hay un método con índice, por lo que el bucle for normal no se puede usar para atravesar

  5. Dado que es una colección de conjuntos, no contiene una colección de elementos repetidos


Mira un fragmento de código:

package Set;

import java.util.TreeSet;

public class TreeSetDemo01 {
    
    
	public static void main(String[] args) {
    
    
		
		//集合创建要使用引用,即包装类
		TreeSet<Integer> ts=new TreeSet<>();
		//自然排序	
		ts.add(20);
		ts.add(40);
		ts.add(30);
		ts.add(10);
		ts.add(30);
		
		for(Integer i:ts) {
    
    //输出10 20 30 40
			System.out.println(i);
		}
	}
}

Agregue 20,40,30,10,30 al conjunto, y finalmente emita 10 20 30 40, salida en orden natural.


Orden natural

Veamos un caso:

Almacene los objetos de los estudiantes y recorra, cree una colección utilizando el método de construcción sin argumentos.
Requisito: ordenar por edad de menor a mayor. Cuando la edad sea la misma, ordenar en orden alfabético por nombre

Primero cree la clase del estudiante:

package Set;

public class student implements Comparable<student>{
    
    
	private String name;
	private int age;
	
	//构造方法
	public student() {
    
    
		System.out.println("无参构造");
	}
	
	public student(String name,int age) {
    
    
		this.name=name;
		this.age=age;
	}
	
	//提供get/set方法
	public void setAge(int age) {
    
    
		if(age<0||age>100)
		{
    
    
			System.out.println("年龄有误");
		}else {
    
    
			this.age=age;
		}
		
	}
	
	public int getAge() {
    
    
		return age;
	}
	
	public void setName(String name) {
    
    
		this.name=name;
	}
	
	public String getName() {
    
    
		return name;
	}
	
	public void show() {
    
    
		System.out.println(name+","+age);
	}

	@Override
	public int compareTo(student s) {
    
    
		//return 0;//重复元素,不添加
		//return 1;//按照输入升序排序
		//return -1;//按照输入逆序排序
		int num=this.age-s.age;//年龄升序 this为s2,s为s1
		//int num=s.age-this.age;//降序
		
		int num2=num==0?this.name.compareTo(s.name):num;
		return num2;
	}
	
}

El orden natural significa que la clase a la que pertenece el elemento implementa la interfaz Comparable y anula el método compareTo (To)

  • return 0; // Elementos repetidos, no agregar
  • return 1; // Ordenar en orden ascendente de entrada
  • return -1; // Ordenar según el orden inverso de entrada

La siguiente línea de código es para juzgar si dos personas tienen la misma edad, luego comparar los nombres, porque String es una reescritura de compareTo, por lo que se puede usar directamente

int num2=num==0?this.name.compareTo(s.name):num;
@Override
	public int compareTo(student s) {
    
    
		//return 0;//重复元素,不添加
		//return 1;//按照输入升序排序
		//return -1;//按照输入逆序排序
		int num=this.age-s.age;//年龄升序 this为s2,s为s1
		//int num=s.age-this.age;//降序
		
		int num2=num==0?this.name.compareTo(s.name):num;
		return num2;
	}

principal:

package Set;

import java.util.TreeSet;

public class TreeSetDemo02 {
    
    
	
public static void main(String[] args) {
    
    
		
		//集合创建要使用引用,即包装类
		TreeSet<student> ts=new TreeSet<>();
		
		student s1=new student("小李",20);
		student s2=new student("小李",50);
		student s3=new student("小张",35);
		student s4=new student("小王",18);
		student s5=new student("小康",35);
		
		ts.add(s1);
		ts.add(s2);
		ts.add(s3);
		ts.add(s4);
		ts.add(s5);
		
		for(student s:ts) {
    
    
			System.out.println(s.getName()+","+s.getAge());
		}
	}		
}


Tipo de comparador especificado

Mire directamente un caso:

Almacene los objetos de los estudiantes y recorra, cree una colección usando el método de construcción con parámetros
* Requisito: ordenar por edad de menor a mayor, cuando la edad es la misma, ordenar en orden alfabético por nombre

De acuerdo con la clasificación del comparador, definitivamente es necesario implementar la interfaz Comparator en la clase.
Aquí se usa directamente la clase interna anónima para implementar la interfaz Comparator.


Categoría de estudiante:

package Set;

public class student03{
    
    
	private String name;
	private int age;
	
	//构造方法
	public student03() {
    
    
		System.out.println("无参构造");
	}
	
	public student03(String name,int age) {
    
    
		this.name=name;
		this.age=age;
	}
	
	//提供get/set方法
	public void setAge(int age) {
    
    
		if(age<0||age>100)
		{
    
    
			System.out.println("年龄有误");
		}else {
    
    
			this.age=age;
		}
		
	}
	
	public int getAge() {
    
    
		return age;
	}
	
	public void setName(String name) {
    
    
		this.name=name;
	}
	
	public String getName() {
    
    
		return name;
	}
	
	public void show() {
    
    
		System.out.println(name+","+age);
	}
	
}

principal:

package Set;

import java.util.Comparator;
import java.util.TreeSet;

public class TreeSetDemo03 {
    
    


public static void main(String[] args) {
    
    
			
		TreeSet<student03> ts=new TreeSet<student03>(new Comparator<student03>() {
    
    
			@Override
			public int compare(student03 s1,student03 s2) {
    
    //匿名内部类实现Comparator接口
				//this.age-s.age
				//s1  s2
				int num=s1.getAge()-s2.getAge();
				int num2=num==0?s1.getName().compareTo(s2.getName()):num;
				return num2;
			}		
		});
	
		student03 s1=new student03("小李",20);
		student03 s2=new student03("小李",50);
		student03 s3=new student03("小张",35);
		student03 s4=new student03("小王",18);
		student03 s5=new student03("小康",35);
		
		ts.add(s1);
		ts.add(s2);
		ts.add(s3);
		ts.add(s4);
		ts.add(s5);
		
		for(student03 s:ts) {
    
    
			System.out.println(s.getName()+","+s.getAge());
		}
	}		
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45102820/article/details/113527294
Recomendado
Clasificación