Registro de aprendizaje de Java (intermedio) - [3], marco de recopilación

Primero, un diagrama simplificado del marco de recopilación: ↓ ↓ ↓ 

(1), interfaz de colección

Collection es la interfaz principal de List , Set , Queue (primero en entrar , primero en salir) , Deque (lista de doble enlace) y otras interfaces.

[Nota: no hay relación entre la colección y el mapa. La colección contiene objetos uno por uno y el mapa contiene pares clave-valor.]
[Nota: Deque hereda la cola e indirectamente hereda la colección]

(2), clase Colecciones

Colecciones es una clase, una clase de herramienta para contenedores, al igual que Arrays es una clase de herramienta para arreglos, también puede realizar algunas operaciones en el contenedor.

Palabras clave de nombre de método Caracteristicas
contrarrestar Contrarrestar
barajar Confusión (desorden del orden)
ordenar Ordenar
intercambiar Intercambiar datos en la posición del subíndice especificada
girar Desplaza los datos de la colección hacia la derecha por la longitud de la unidad especificada
SynchronizedList Convierta colecciones no seguras para subprocesos en colecciones seguras para subprocesos
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionsTest {

	public static void main(String[] args) {
		// 初始化List
		List<Integer> list = new ArrayList<>();
		for (int i = 0; i < 10; i++) {
			list.add(i+1);
		}
		// 原List
		System.out.println("原list:\t\t\t" + list);
		
		
		
		System.out.println("******************************");
		
		
		
		// 反转
		Collections.reverse(list);
		System.out.println("反转后的list:\t\t" + list);
		
		
		
		System.out.println("******************************");
		
		
		
		// 混淆
		Collections.shuffle(list);
		System.out.println("混淆后的list:\t\t" + list);
		
		
		
		System.out.println("******************************");
		
		
		
		// 排序
		Collections.sort(list);
		System.out.println("排序后的list:\t\t" + list);
		
		
		
		System.out.println("******************************");
		
		
		
		// 交换两个位置的数据
		Collections.swap(list, 0, 1);
		System.out.println("交换0和1下标的数据后的list:\t" + list);
		
		
		
		System.out.println("******************************");
		
		
		
		// 先恢复原list
		Collections.swap(list, 0, 1);
		System.out.println("恢复后的list:\t\t" + list);
		// 滚动
		Collections.rotate(list, 3);
		System.out.println("向右滚动3个单位后的list:\t" + list);
		
		
		
		System.out.println("******************************");
		
		
		
		// 线程安全化
		List<Integer> newList = Collections.synchronizedList(list);
		// 把原来不是线程安全的list转换为了现在线程安全的newList
		
	}
	
}

Resultado de salida:

(3) Interfaz de lista y clase ArrayList

Los objetos de la colección List están organizados en un orden determinado y el contenido del interior puede repetirse;

Las clases implementadas por la interfaz List son: ArrayList (para implementar matrices dinámicas) , Vector (para implementar matrices dinámicas) , LinkedList (para implementar listas enlazadas) , Stack (para implementar pilas) .

[1], las limitaciones de usar matrices

Si desea almacenar varios objetos, puede usar matrices, ¡pero las matrices tienen limitaciones! ! !

Por ejemplo: si declara una matriz con una longitud de 10, la matriz no utilizada se desperdiciará y el número de más de 10 no encajará. ! !

[2] 、 ArrayList

Para resolver las limitaciones de las matrices, se introduce el concepto de clases contenedoras. La clase de contenedor más común es: La capacidad "capacidad" del contenedor ArrayList  aumentará automáticamente a medida que aumenta el objeto.

[3] Métodos comunes de ArrayList

Palabras clave de nombre de método Caracteristicas
contiene Determina si existe
añadir Agregar objeto
añadir todo Agregar todos los objetos en otro contenedor
eliminar Eliminar objeto
claro Vacío
conjunto Reemplazar el objeto en una posición determinada (reasignación)
obtener Obtener el objeto en la ubicación especificada
índice de Obtener la ubicación del objeto
toArray Convertir a matriz
Talla Obtener tamaño

[4], recorrido de iterador

Utilice iterador Iterador para recorrer los elementos de la colección , el principio es el siguiente: ↓ ↓ ↓ 

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorTest {

	public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        
        for (int i = 0; i < 5; i++) {
			list.add("String " + i);
		}
        System.out.println("最初的list为:" + list);
        
        // 获取List的迭代器
        Iterator<String> iterator = list.iterator();
        
        //从最开始的位置判断"下一个"位置是否有数据
        //如果有就通过next取出来,并且把指针向下移动
        //直到"下一个"位置没有数据
        
        System.out.println("--------使用while的iterator-------");
        // 利用while循环遍历
        while(iterator.hasNext()) {
        	String str = iterator.next();
        	System.out.println(str);
        }
        
        System.out.println("--------使用for的iterator-------");
        // 利用for循环遍历
        for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
			String str = it.next();
			if(str.equals("String 2")) {
				it.remove();
				System.out.println(str + "(当字符串为“String 2”时从迭代器中删除它)");
			}else {
				System.out.println(str);
			}
		}
        System.out.println("删除“String 2”后的list为:" + list);
        
         
    }

}

Resultado de salida:

Puede utilizar iteradores para eliminar elementos de la lista.

(4) 、 LinkedList

La secuencia se divide en: primero en entrar, primero en salir FIFO , primero en entrar-último en salir FILO 
FIFO también se llama Cola 
en Java, FILO también se llama Pila en Java

[1] Al igual que ArrayList, LinkedList también implementa la interfaz List;

[2] Pero al mismo tiempo, LinkedList no solo implementa la interfaz List, sino que LinkedList también implementa la estructura de lista doblemente vinculada Deque, que puede insertar y eliminar datos fácilmente al principio y al final;

import java.util.LinkedList;
import java.util.List;

public class CollectionsTest {
	
	public static void main(String[] args) {
        
        //LinkedList是一个双向链表结构的list
        LinkedList<String> list =new LinkedList<>();
         
        //所以可以很方便的在头部和尾部插入数据
        //在最后插入新的字符串
        list.addLast("String 1");
        list.addLast("String 2");
        list.addLast("String 3");
        System.out.println("加入数据后的list:\t\t" + list);
         
        //在最前面插入新的字符串
        list.addFirst("String X");
        System.out.println("最前面插入新的字符串后的list:\t" + list);
         
        //查看最前面的字符串
        System.out.println("最前面的字符串:\t\t " + list.getFirst());
        //查看最后面的字符串
        System.out.println("最后面的字符串:\t\t " + list.getLast());
         
        //查看不会导致元素被删除
        System.out.println("再次查看list:\t\t" + list);
        //取出最前面的字符串
        System.out.println("取出来的最前面的字符串:\t " + list.removeFirst());
         
        //取出最后面的字符串
        System.out.println("取出来的最后面的字符串:\t " + list.removeLast());
         
        //取出会导致元素被删除
        System.out.println("再次查看list:\t\t" + list);
         
    }
	
}

Resultado de salida:

[3] Además de implementar List y Deque , LinkedList también implementa la interfaz Queue (cola)

La cola es un FIFO de cola de primero en entrar, primero en salir, métodos comúnmente utilizados:

offer        在最后添加元素
poll         取出第一个元素
peek         查看第一个元素
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class CollectionsTest {

	public static void main(String[] args) {

		// 和ArrayList一样,LinkedList也实现了List接口
		List<String> list = new LinkedList<>();

		// 同时,LinkedList还实现了Deque接口
		// Deque代表双向链表
		Deque<String> deque = new LinkedList<>();

		// 同时,LinkedList也实现了Queue这个接口
		// Queue代表FIFO 先进先出的队列
		Queue<String> queue = new LinkedList<>();

		for (int i = 0; i < 2; i++) {
			queue.offer("String " + i); // 在最后添加元素
		}
		for (int i = 0; i < 3; i++) {
			queue.add("String " + (i + 2)); // 与offer()同样的效果,添加元素
		}    //
		System.out.println("利用offer()方法或add()方法添加元素。");
		System.out.println("添加元素后的queue为:\t" + queue);
		System.out.println();

		String first = queue.peek();    //
		System.out.println("利用peek()方法查看第一个元素。");
		System.out.println("查看第一个元素:\t\t " + first);
		System.out.println();

		queue.poll();    //
		System.out.println("利用poll()方法取出第一个元素。");
		System.out.println("取出第一个元素......");
		System.out.println("第一个元素取出后的queue为:\t" + queue);

	}

}

Resultado de salida:

(5) Árbol binario

El árbol binario se compone de varios nodos Las características del
árbol binario:
       cada nodo puede tener un nodo hijo izquierdo, un nodo hijo derecho y un valor.

public class Node {
    // 左子节点
    public Node leftNode;
    // 右子节点
    public Node rightNode;
    // 值
    public Object value;
}

[1], Principio de datos de inserción de árbol binario:

Suponga que los siguientes 10 números aleatorios se ordenan a través de un árbol binario
67, 7, 30, 73, 10, 0, 78, 81, 10, 74.
El primer paso de la clasificación es insertar datos en el árbol binario. La
lógica básica para insertar es, pequeño , El mismo lugar a la izquierda, el más grande a la derecha
1. 67 en el nodo raíz
2. 7 es menor que 67, el nodo izquierdo en 67 es
3. 30 es menor que 67, se encuentra el nodo izquierdo de 67 y 30 es mayor que 7, entonces Ponga el nodo derecho de
7. 4. 73 es mayor que 67, ponga el nodo derecho de
67, 5. 10 es menor que 67, encuentre el nodo izquierdo de 67, 10 es mayor que 7 y encuentre el nodo derecho de 7, 30, 10 es menor que 30, Colóquelo en el nodo izquierdo del 30.
...
...
9.10 menos que 67 para encontrar el nodo izquierdo 67 7,10 más grande que 7, encuentre el nodo derecho 7 de 30, 10 de 30 horas para encontrar el nodo izquierdo 30 tan grande como 10, 10 y 10, Poner a la izquierda

public class Node {

	/**
	 * 左子节点
	 */
	public Node leftNode;
	/**
	 * 右子节点
	 */
	public Node rightNode;
	/**
	 * 值
	 */
	public Object value;

	/**
	 * 插入数据
	 * @param v
	 */
	public void add(Object v) {
		// 如果当前节点没有值,就把数据放在当前节点上
		if (value == null) {
			value = v;
		} else { // 如果当前节点有值,就进行判断,新增的值与当前的值的大小关系
			// 新增的值,比当前值小或者相同
			if ((Integer) value - (Integer) v >= 0) {
				if (leftNode == null) {
					leftNode = new Node();
				}
				leftNode.add(v);
			}
			// 新增的值,比当前值大
			else {
				if (rightNode == null) {
					rightNode = new Node();
				}
				rightNode.add(v);
			}
		}
	}

	public static void main(String[] args) {

		int randoms[] = new int[] { 67, 7, 30, 73, 10, 0, 78, 81, 10, 74 };
		Node roots = new Node();
		for (int number : randoms) {
			roots.add(number);
		}

	}

}

[2], Cruce de árbol binario:

Mediante el comportamiento de inserción del paso anterior, los datos realmente se ordenan. Lo siguiente que debe hacer es ver, atravesar estos datos ordenados en nuestra forma de lista o matriz de uso común.

El recorrido del árbol binario se divide en primer orden, orden medio y segundo orden
[primer orden], es decir: el número medio después del recorrido Colóquelo a la izquierda
[Orden del medio]: el número del medio se atraviesa y se coloca en el medio
[Pedido posterior]: El número del medio se atraviesa y se coloca a la derecha

import java.util.ArrayList;
import java.util.List;

public class Node {

	/**
	 * 左子节点
	 */
	public Node leftNode;
	/**
	 * 右子节点
	 */
	public Node rightNode;
	/**
	 * 值
	 */
	public Object value;

	/**
	 * 插入数据
	 * @param v
	 */
	public void add(Object v) {
		// 如果当前节点没有值,就把数据放在当前节点上
		if (value == null) {
			value = v;
		} else { // 如果当前节点有值,就进行判断,新增的值与当前的值的大小关系
			// 新增的值,比当前值小或者相同
			if ((Integer) value - (Integer) v >= 0) {
				if (leftNode == null) {
					leftNode = new Node();
				}
				leftNode.add(v);
			}
			// 新增的值,比当前值大
			else {
				if (rightNode == null) {
					rightNode = new Node();
				}
				rightNode.add(v);
			}
		}
	}

	// 先序遍历所有的节点
	public List<Object> valuesOfLeft() {
		
		List<Object> values = new ArrayList<>();
		
		// 当前节点
		values.add(value);
		
		// 左节点的遍历结果
		if (leftNode != null) {
			values.addAll(leftNode.valuesOfLeft());
		}
		
		// 右节点的遍历结果
		if (rightNode != null) {
			values.addAll(rightNode.valuesOfLeft());
		}
		
		return values;
		
	}

	// 中序遍历所有的节点
	public List<Object> valuesOfCenter() {
		
		List<Object> values = new ArrayList<>();
		
		// 左节点的遍历结果
		if (leftNode != null) {
			values.addAll(leftNode.valuesOfCenter());
		}
		
		// 当前节点
		values.add(value);
		
		// 右节点的遍历结果
		if (rightNode != null) {
			values.addAll(rightNode.valuesOfCenter());
		}
		
		return values;
		
	}

	// 后序遍历所有的节点
	public List<Object> valuesOfRight() {
		
		List<Object> values = new ArrayList<>();
		
		// 左节点的遍历结果
		if (leftNode != null) {
			values.addAll(leftNode.valuesOfRight());
		}
		
		// 右节点的遍历结果
		if (rightNode != null) {
			values.addAll(rightNode.valuesOfRight());
		}
		
		// 当前节点
		values.add(value);
		
		return values;
		
	}

	public static void main(String[] args) {

		int randoms[] = new int[] { 67, 7, 30, 73, 10, 0, 78, 81, 10, 74 };
		Node roots = new Node();
		for (int number : randoms) {
			roots.add(number);
		}

		System.out.println("先序遍历的二叉树:\t" + roots.valuesOfLeft());
		System.out.println("中序遍历的二叉树:\t" + roots.valuesOfCenter());
		System.out.println("后序遍历的二叉树:\t" + roots.valuesOfRight());

	}

}

Resultado de salida:

(6) 、 HashMap

La forma en que HashMap almacena los datos es pares clave-valor

Para HashMap, la clave es única y no se puede repetir. 
Por lo tanto, insertar diferentes valores en el Mapa con la misma clave hará que los elementos antiguos se sobrescriban, dejando solo el último elemento insertado. 
Sin embargo, el mismo objeto se puede insertar en el mapa como un valor, siempre que la clave correspondiente sea diferente

(7) 、 HashSet

Los elementos del conjunto no se pueden repetir

[1], sin orden

Los elementos del conjunto no tienen ningún orden. 
Estrictamente hablando,

el orden específico del HashSet no está organizado en el orden de inserción de los elementos , ni en el orden de inserción ni en el orden del código hash.

En otras palabras, lo mismo es insertar 0-9 en HashSet, el orden de visualización es diferente en diferentes versiones de JVM.

import java.util.HashSet;

public class HashSetTest {

	public static void main(String[] args) {

		HashSet<String> set = new HashSet<>();
		
		set.add("hello");
		set.add("world");
		set.add("!!!");
		
		System.out.println(set);
		
	}

}

resultado de la operación:

[2], transversal

El conjunto no proporciona get () para obtener el elemento en la posición especificada, 
por lo que se necesitan iteradores o bucles for mejorados para el recorrido.

[3] La relación entre HashSet y HashMap

Al observar el código fuente de HashSet, se
puede encontrar que HashSet en sí no tiene una implementación independiente, pero un Map está encapsulado en él.
HashSet existe como la clave del Map
y el valor es un objeto Object estático llamado PRESENT, porque es Un atributo de clase, por lo que solo habrá uno.

private static final Object PRESENT = new Object();
package collection;

import java.util.AbstractSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable {
	// HashSet里封装了一个HashMap
	private HashMap<E, Object> map;

	private static final Object PRESENT = new Object();

	// HashSet的构造方法初始化这个HashMap
	public HashSet() {
		map = new HashMap<E, Object>();
	}

	// 向HashSet中增加元素,其实就是把该元素作为key,增加到Map中
	// value是PRESENT,静态,final的对象,所有的HashSet都使用这么同一个对象
	public boolean add(E e) {
		return map.put(e, PRESENT) == null;
	}

	// HashSet的size就是map的size
	public int size() {
		return map.size();
	}

	// 清空Set就是清空Map
	public void clear() {
		map.clear();
	}

	// 迭代Set,就是把Map的键拿出来迭代
	public Iterator<E> iterator() {
		return map.keySet().iterator();
	}

}

(8) 、 Conjunto

HashSet Unordered
LinkedHashSet
Ordena según el orden de inserción TreeSet de pequeño a grande

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;

public class HashSetTest {
	
	public static void main(String[] args) {

        HashSet<String> numberSet1 =new HashSet<>();
        //HashSet中的数据不是按照插入顺序存放
        numberSet1.add("bbbbb");
        numberSet1.add("aaaaa");
        numberSet1.add("ccccc");
        System.out.println(numberSet1);
          
        LinkedHashSet<String> numberSet2 =new LinkedHashSet<>();
        //LinkedHashSet中的数据是按照插入顺序存放
        numberSet2.add("bbbbb");
        numberSet2.add("aaaaa");
        numberSet2.add("ccccc");
        System.out.println(numberSet2);

        TreeSet<String> numberSet3 =new TreeSet<>();
        //TreeSet 中的数据是进行了排序的
        numberSet3.add("bbbbb");
        numberSet3.add("aaaaa");
        numberSet3.add("ccccc");
        System.out.println(numberSet3);
          
    }

}

resultado de la operación:

(9) La diferencia entre ArrayList y LinkedList

ArrayList es la estructura de [Lista de secuencias], [Buscar datos rápidamente], [Insertar y eliminar datos es lento],
LinkedList es la estructura de [Lista vinculada], [Buscar datos es lento], [Insertar y eliminar datos rápidamente].

(10) La diferencia entre ArrayList y HashSet

ArrayList tiene orden y los datos se pueden repetir;
HashSet no tiene orden y los datos no se pueden repetir.

El criterio de juicio de repetición de HashSet es:
primero observe si el código hash es el mismo.
Si el código hash es diferente, se considera datos diferentes.
Si el código hash es el mismo, entonces compare iguales. Si iguales son iguales, son los mismos datos; de lo contrario, son datos diferentes.

(11) La diferencia entre HashMap y HashTable

 

Tanto HashMap como Hashtable implementan la interfaz Map, ambos son pares clave-valor para almacenar datos.
Diferencia 1: 
HashMap puede almacenar valores nulos,
Hashtable no puede almacenar valores nulos.
Diferencia 2:
HashMap no es una clase segura para subprocesos
Hashtable es una clase segura para subprocesos

import java.util.HashMap;
import java.util.Hashtable;

public class MapTableTest {

	public static void main(String[] args) {

		// HashMap 可以存放 null 值
		HashMap<String, Integer> map = new HashMap<>();
		map.put("first", null);
		System.out.println(map);

		// Hashtable 不能存放null 值
		Hashtable<String, Integer> table = new Hashtable<>();
		table.put("first", null);
		System.out.println(table);

	}

}

resultado de la operación:

(12) Principio de HashCode

[1], comparación de eficiencia

Las diferencias que trae HashCode son las siguientes:

[2], principio HashCode

Por ejemplo, si desea encontrar el significado chino correspondiente de una palabra en un diccionario inglés-chino, suponga que la palabra es Lengthdary, primero busque Lengthdary en el directorio de la página 555. 

Luego, vaya a la página 555. No solo hay una palabra en esta página, sino que la cantidad es muy pequeña Compárelas una por una y localice rápidamente la longitud de la palabra objetivo.

555 es equivalente al código hash correspondiente a Lengendary

[3], analice las razones del excelente rendimiento de HashMap

----- Concepto de código hash -----
Todos los objetos tienen un código hash correspondiente (valor hash). Por
ejemplo, la cadena "gareen" corresponde a 1001 (en realidad no, aquí hay un valor conveniente para comprender, valor hipotético) ) Por
ejemplo, la cadena "temoo" corresponde a 1004. Por
ejemplo, la cadena "db" corresponde a 1008. Por
ejemplo, la cadena "annie" corresponde a 1008.

----- Guarde los datos -----
Prepare una matriz cuya longitud sea 2000 y establezca un algoritmo de código hash especial, de modo que el código hash correspondiente a todas las cadenas se sitúe entre
0 y 999. Para almacenar el héroe cuyo nombre es "gareen", el héroe y el nombre forman un par clave-valor y lo almacenan en
Para almacenar el héroe cuyo nombre es "temoo" en la posición 1001 de la matriz, almacene el héroe en la posición 1004 de la matriz.
Para almacenar el héroe cuyo nombre es "db", almacene el héroe en la posición 1008 de la matriz.
Para almacenar el héroe cuyo nombre es "annie", pero ya hay un héroe db en la ubicación correspondiente al código hash 1008 de "annie", luego cree una lista vinculada aquí y almacene a annie después del héroe db

----- busque datos-- --- Por
ejemplo, para encontrar gareen, primero calcule que el código hash de "gareen" sea 1001, y ubíquelo en la matriz de acuerdo con el subíndice de 1001. (La ubicación de acuerdo con el subíndice de la matriz es muy rápida). Se encuentra que solo hay una posición de 1001 Héroe, entonces el héroe es verde.
Por ejemplo, para encontrar a annie, primero calcule que el código hash de "annie" sea 1008. De acuerdo con el subíndice de 1008, ubíquelo en la matriz y encuentre que hay dos héroes en la posición 1008, luego compare los nombres de los dos héroes uno por uno (iguales) , Porque la cantidad a comparar en este momento es mucho menor, y el héroe objetivo se puede encontrar pronto
Este es el uso de hashmap para consultas, que es muy rápido.


Esta es una forma de pensar que usa el espacio para el tiempo.

åæHashMapæ§è½åè¶çåå 

[4], HashSet juzga si se repite

Los datos de HashSet no se pueden repetir. Los mismos datos no se pueden almacenar juntos. ¿Cómo juzgar si se repiten?
De acuerdo con la relación entre HashSet y HashMap, aprendimos que debido a que HashSet no tiene su propia implementación, sino que encapsula un HashMap, esencialmente determina si la clave del HashMap está duplicada.

A través del paso anterior de aprendizaje, si la clave se repite se juzga mediante dos pasos:
si el código hash es el mismo.
        Si el código hash es diferente, está en un pozo diferente.
        Si el código hash es el mismo, está en el mismo pozo. También es necesario comparar
                iguales. Si igual es igual, son datos duplicados.
                Si igual no es igual, son datos diferentes.

(13) Comparador

El método Collections.sort () puede ordenar los elementos de la colección

Sin embargo, si hay una colección, los elementos en ella son todos objetos de tipo Persona y sus atributos son nombre, edad, dirección, etc., ¿según qué atributo ordenar?

¡Esto requiere un comparador! ! !

[1], método uno

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;

public class ComparatorTest {

	public static void main(String[] args) {

		Random r = new Random();
		List<Person> persons = new ArrayList<>();

		for (int i = 0; i < 10; i++) {
			persons.add(new Person("张" + i, r.nextInt(20) + 20, "西安"));
		}
		System.out.println("初始化后的集合:");
		System.out.println(persons);

		// 直接调用sort会出现编译错误,因为Person有各种属性
		// 到底按照哪种属性进行比较,Collections也不知道,不确定,所以没法排
		// Collections.sort(persons);

		// 引入Comparator,指定比较的算法
		Comparator<Person> c = new Comparator<Person>() {
			@Override
			public int compare(Person p1, Person p2) {
				// 按照hage进行排序
				if (p1.age >= p2.age)
					return 1; // 正数表示p1比hp2要大
				else
					return -1;
			}
		};
		Collections.sort(persons, c);
		System.out.println("按照年龄排序后的集合:");
		System.out.println(persons);

	}

}

class Person {
	public String name;
	public int age;
	public String address;

	public Person(String name, int age, String address) {
		this.name = name;
		this.age = age;
		this.address = address;
	}

	@Override
	public String toString() {
		return "\n" + "Name : " + name + "\tAge : " + age + "\tAddress : " + address;
	}

}

Resultados de:

[2], método dos

Haga que la clase Person implemente la interfaz Comparable
. Proporcione el algoritmo de comparación
Collections.sort en la clase para tener suficiente información para ordenar, y no es necesario proporcionar un comparador adicional Comparator

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;

public class ComparatorTest {

	public static void main(String[] args) {

		Random r = new Random();
		List<Person> persons = new ArrayList<>();

		for (int i = 0; i < 10; i++) {
			persons.add(new Person("张" + i, r.nextInt(20) + 20, "西安"));
		}
		System.out.println("初始化后的集合:");
		System.out.println(persons);

		// 直接调用sort会出现编译错误,因为Person有各种属性
		// 到底按照哪种属性进行比较,Collections也不知道,不确定,所以没法排
		// Collections.sort(persons);

		// 引入Comparator,指定比较的算法
		Comparator<Person> c = new Comparator<Person>() {
			@Override
			public int compare(Person p1, Person p2) {
				// 按照hage进行排序
				if (p1.age >= p2.age)
					return 1; // 正数表示p1比hp2要大
				else
					return -1;
			}
		};
		
		//Person类实现了接口Comparable,即自带比较信息。
        //Collections直接进行排序,无需额外的Comparator
		Collections.sort(persons);
		System.out.println("按照年龄排序后的集合:");
		System.out.println(persons);

	}

}

class Person implements Comparable<Person> {
	public String name;
	public int age;
	public String address;

	public Person(String name, int age, String address) {
		this.name = name;
		this.age = age;
		this.address = address;
	}

	@Override
	public String toString() {
		return "\n" + "Name : " + name + "\tAge : " + age + "\tAddress : " + address;
	}

	@Override
	public int compareTo(Person o) {
		if (age > o.age) {
			return 1;
		}
		return -1;
	}

}

resultado de la operación:

Supongo que te gusta

Origin blog.csdn.net/qq_37164975/article/details/82688248
Recomendado
Clasificación