English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Un problema de colección de Java: múltiples enfoques de resolución

Pregunta:Clase30, el número de matrícula del estudiante es20070301-20070330, todos los estudiantes han elegido el curso de diseño de programas de Java, se proporcionan todas las calificaciones de los estudiantes (se pueden generar números aleatorios, rango60-100),Escriba un programa para ordenar y imprimir las calificaciones de todos los estudiantes de la clase de manera ascendente.

Requisitos:Implementar con List, Map y Set, la información impresa incluye número de matrícula, nombre y calificación.

1、Implementar utilizando la colección List

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.Iterator; 
import java.util.LinkedList; 
import java.util.TreeMap; 
public class Test2{ 
  public static void main(String[] args){ 
    /* Aquí se utiliza ArrayList 
     * 
     * ArrayList<Student>al=new ArrayList<Student>(); 
    for(int i=20070301,j=10;i<=20070330;i++,j++) 
    { 
      al.add(new Student(i,(int) (40*Math.random()+60), "compañero"+j)); 
    } 
    //El ordenamiento de ArrayList se realiza mediante el método sort() de Collections. 
    Collections.sort(al, new Sortbygrade()); 
    for(Student sd:al) 
    System.out.println(sd); 
    */ 
    LinkedList<Student> lt=new LinkedList<Student>(); 
    for(int i=20070301,j=10;i<=20070330;i++,j++) 
    { 
      lt.add(new Student(i,(int) (40*Math.random()+60), "compañero"+j)); 
    } 
    //Ordenar la lista 
    Collections.sort(lt, new Sortbygrade()); 
    //Salida de la lista 
    for(Student sd:lt) 
      System.out.println(sd); 
  } 
} 
//Clase de estudiante 
class Student{ 
  int num,grade; 
  String name; 
  //Constructor 
  public Student(int num,int grade,String name){ 
    this.num=num; 
    this.name=name; 
    this.grade=grade; 
  } 
  //Aquí debe sobrescribirse 
  public String toString(){ 
//   System.out.println("hi"); 
    return "Número de matrícula:"+this.num+"\t"+"Nombre:"+this.name+"  "+"成绩:"+this.grade; 
  } 
} 
//Crear una clase comparadora 
class Sortbygrade implements Comparator<Student>{ 
  @Override 
  public int compare(Student s1, Student s2) { 
    if(s1.grade>s2.grade) 
      return 1; 
    if(s1.grade<s2.grade) 
      return -1; 
    if(s1.grade==s2.grade) 
      return s1.name.compareTo(s2.name); 
    return 0;     
  } 
} 

 El resultado de la salida se muestra en la figura:

Para el cuadro de la colección ListResumen:

1La colección List es en realidad un array dinámico, los elementos pueden ser extraídos directamente a través de un bucle for, sin necesidad de iteración.
2) al imprimir conjuntos List, se llama por defecto al método toString()almacenado en el objeto del conjunto, por lo tanto, es necesario sobrescribir en la clase.
Si no se sobrescribe el método toString( ), entonces debe usarse

for(int i=0; i<lt.size(); i++) 
{ 
  Student s=lt.get(i); 
  System.out.println("学号:"+s.num+"  Nombre:",+s.name+"  Calificaciones:",+s.grade); 
} 

3) para ordenar conjuntos List se necesita utilizar la clase de herramientas Collections, es decir, Collections.Sort(list, new ClaseComparadora()) método. Por lo tanto, es necesario personalizar una clase comparadora, definir sus propias reglas de comparación.

2) utilizar conjuntos Set para implementar
(1) utilizar TreeSet para implementar

package com.package1; 
import java.util.*; 
public class StuScore { 
public static void main(String[] args) { 
  TreeSet<Student> ts=new TreeSet<Student>(new Com()); 
  //Agregar elementos dentro 
  for(int i=20070301,j=1;i<=20070330;i++,j++) 
  { 
    ts.add(new Student(i, "Estudiante",+j, (int) (40*Math.random()+60))); 
  } 
  //Iterar y extraer 
  Iterator<Student> it=ts.iterator(); 
  while(it.hasNext()) 
  { 
    Student o1=it.next(); 
    System.out.println("学号:"+o1.num+" ",+"姓名:"+o1.name+" ",+" ",+"Calificaciones:",+o1.grade); 
  } 
} 
} 
//Clase de estudiante 
class Student  
{ 
int num; 
int grade; 
String name; 
public Student(int num, String name, int grade) 
{ 
  this.num=num; 
  this.name=name; 
  this.grade=grade; 
} 
} 
class Com implements Comparator 
{ 
@Override 
public int compare(Object o1, Object o2) { 
  Student s1=(Student) o1; 
  Student s2=(Student) o2; 
  if(s1.grade>s2.grade) 
    return 1; 
  if(s1.grade<s2.grade) 
    return -1; 
  if(s1.grade==s2.grade) 
  { 
    return new Integer(s1.num).compareTo(new Integer(s2); 
  } 
  return 0; 
} 
} 

El resultado de la salida es:

Número de matrícula:20070307  Nombre: Estudiante16    Calificaciones:60
Número de matrícula:20070309  Nombre: Estudiante18    Calificaciones:60
Número de matrícula:20070314  Nombre: Estudiante23    Calificaciones:61
Número de matrícula:20070318  Nombre: Estudiante27    Calificaciones:61
Número de matrícula:20070322  Nombre: Estudiante31    Calificaciones:61
Número de matrícula:20070306  Nombre: Estudiante15    Calificaciones:62
Número de matrícula:20070310  Nombre: Estudiante19    Calificaciones:64
Número de matrícula:20070302  Nombre: Estudiante11    Calificaciones:66
Número de matrícula:20070308  Nombre: Estudiante17    Calificaciones:68
Número de matrícula:20070321  Nombre: Estudiante30 Calificaciones:68
Número de matrícula:20070330 Nombre: Estudiante39    Calificaciones:69
Número de matrícula:20070303  Nombre: Estudiante12    Calificaciones:70
Número de matrícula:20070320 Nombre: Estudiante29    Calificaciones:70
Número de matrícula:20070323  Nombre: Estudiante32    Calificaciones:77
Número de matrícula:20070313  Nombre: Estudiante22    Calificaciones:78
Número de matrícula:20070304  Nombre: Estudiante13    Calificaciones:79
Número de matrícula:20070324  Nombre: Estudiante33    Calificaciones:83
Número de matrícula:20070326  Nombre: Estudiante35    Calificaciones:84
Número de matrícula:20070327  Nombre: Estudiante36    Calificaciones:85
Número de matrícula:20070311  Nombre: Estudiante20 Calificaciones:88
Número de matrícula:20070305  Nombre: Estudiante14    Calificaciones:89
Número de matrícula:20070329  Nombre: Estudiante38    Calificaciones:89
Número de matrícula:20070316  Nombre: Estudiante25    Calificaciones:90
Número de matrícula:20070301  Nombre: Estudiante10    Calificaciones:95
Número de matrícula:20070312  Nombre: Estudiante21    Calificaciones:96
Número de matrícula:20070317  Nombre: Estudiante26    Calificaciones:97
Número de matrícula:20070319  Nombre: Estudiante28    Calificaciones:97
Número de matrícula:20070325  Nombre: Estudiante34    Calificaciones:98
Número de matrícula:20070315  Nombre: Estudiante24    Calificaciones:99
Número de matrícula:20070328  Nombre: Estudiante37    Calificaciones:99

ParaTreeSetResumen:
1、los elementos no pueden repetirse y TreeSet es ordenado.
2、dos métodos de ordenamiento:
(1) personalizar una clase comparadora, por ejemplo, class Com implements Comparator { } , implementar compare(Object o1, Object o2) definir las reglas de comparación en el método.
(2) hacer que el elemento tenga comparabilidad por sí mismo.
Pasos: Implementar el interfaz Comparable para los elementos que se agregarán a TreeSet y sobrescribir el método compareTo. Este orden también es el orden natural de los elementos, o también se llama orden por defecto.

método1y el método2La diferencia es:

Las dos métodos tienen sus propias ventajas y desventajas, Comparable es simple, cualquier objeto que implemente el interfaz Comparable se convierte directamente en un objeto comparable, pero es necesario modificar el código fuente.

La ventaja de usar Comparator es que no es necesario modificar el código fuente, sino que se debe implementar otro comparador. Cuando un objeto personalizado necesita进行比较时,se puede pasar el comparador y el objeto juntos para compararlos, y en Comparator, el usuario puede implementar lógicas complejas y comunes por sí mismo, lo que puede coincidir con algunos objetos más simples, de modo que se pueden ahorrar muchas tareas repetitivas.

(2)usarHashSetpara implementar

package com.package1; 
import java.util.*; 
public class StuScore { 
  public static void main(String[] args) { 
    HashSet<Student> hs=new HashSet<Student>(); 
    //Agregar elementos dentro 
    for(int i=20070301,j=1;i<=20070330;i++,j++) 
    { 
      hs.add(new Student(i,"Estudiante"+j,(int)  
(40*Math.random()+60))); 
    } 
    ArrayList<Student>li=new ArrayList(hs); 
    Collections.sort(li, new Sortbygrade()); 
    for(Student ss:li) 
      System.out.println(ss); 
  } 
} 
//Clase de estudiante 
class Student  
{ 
  int num; 
  int grade; 
  String name; 
  public Student(int num, String name, int grade) 
  { 
    this.num=num; 
    this.name=name; 
    this.grade=grade; 
  } 
  public String toString(){ 
    //System.out.println("hi"); 
    return "Número de matrícula:"+this.num+"\t"+"Nombre:"+this.name 
+"  "+"成绩:"+this.grade; 
  } 
} 
class Sortbygrade implements Comparator{ 
  @Override 
  public int compare(Object o1, Object o2) { 
    Student s1=(Student) o1; 
    Student s2=(Student) o2; 
    if(s1.grade>s2.grade) 
      return 1; 
    if(s1.grade<s2.grade) 
      return -1; 
//   if(s1.grade==s2.grade) 
    return 0; 
  } 
} 

El resultado de salida es el siguiente:
Número de matrícula:20070310 Nombre: Estudiante19    Puntuación:60
Número de matrícula:20070330 Nombre: Estudiante39    Puntuación:62
Número de matrícula:20070326 Nombre: Estudiante35    Puntuación:63
Número de matrícula:20070317 Nombre: Estudiante26    Puntuación:64
Número de matrícula:20070318 Nombre: Estudiante27    Puntuación:65
Número de matrícula:20070322 Nombre: Estudiante31    Puntuación:65
Número de matrícula:20070301 Nombre: Estudiante10    Puntuación:67
Número de matrícula:20070328 Nombre: Estudiante37    Puntuación:68
Número de matrícula:20070304 Nombre: Estudiante13    Puntuación:68
Número de matrícula:20070319 Nombre: Estudiante28    Puntuación:69
Número de matrícula:20070313 Nombre: Estudiante22    Puntuación:70
Número de matrícula:20070303 Nombre: Estudiante12    Puntuación:71
Número de matrícula:20070312 Nombre: Estudiante21    Puntuación:71
Número de matrícula:20070329 Nombre: Estudiante38    Puntuación:72
Número de matrícula:20070306 Nombre: Estudiante15    Puntuación:72
Número de matrícula:20070324 Nombre: Estudiante33    Puntuación:72
Número de matrícula:20070305 Nombre: Estudiante14    Puntuación:75
Número de matrícula:20070315 Nombre: Estudiante24    Puntuación:75
Número de matrícula:20070314 Nombre: Estudiante23    Puntuación:78
Número de matrícula:20070307 Nombre: Estudiante16    Puntuación:80
Número de matrícula:20070311 Nombre: Estudiante20 Puntuación:81
Número de matrícula:20070302 Nombre: Estudiante11    Puntuación:83
Número de matrícula:20070309 Nombre: Estudiante18    Puntuación:84
Número de matrícula:20070320 Nombre: Estudiante29    Puntuación:85
Número de matrícula:20070321 Nombre: Estudiante30 Puntuación:85
Número de matrícula:20070316 Nombre: Estudiante25    Puntuación:86
Número de matrícula:20070327 Nombre: Estudiante36    Puntuación:90
Número de matrícula:20070308 Nombre: Estudiante17    Puntuación:94
Número de matrícula:20070323 Nombre: Estudiante32    Puntuación:94
Número de matrícula:20070325 Nombre: Estudiante34    Puntuación:95

ParaHashSetResumen:
1Los elementos de HashSet no pueden repetirse, si se agrega repetidamente, solo se mostrará uno.
El principio es el siguiente:
HashSet: la estructura de datos subyacente es una tabla de hash. No es seguro para threads. No sincronizado.
2¿Cómo asegura HashSet la unicidad de los elementos?
答:是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashcode值不同,不会调用equals。
3、对HashSet的排序,通过将Set集合转化为List集合,借助Collections.Sort( )方法实现排序。

3、使用TreeMap来实现

package com.package1;  
import java.util.Comparator; 
import java.util.Iterator; 
import java.util.Set; 
import java.util.TreeMap; 
public class TestTreeMap { 
  public static void main(String[] args) { 
    //1.创建集合 
    TreeMap<Student,Integer> tm=new TreeMap<Student,Integer>(); 
    for(int i=20070301,j=10;i<=20070330;i++,j++) 
    { 
      int grade=(int) (40*Math.random()+60); 
       //2、往集合对象中添加元素 
       tm.put(new Student(grade,"同学"+j),i); 
    } 
    //3.遍历集合 ,排序完成  
    Set<Student> k=tm.keySet(); 
    Iterator<Student> it=k.iterator(); 
    while(it.hasNext()){ 
      Student key=it.next(); 
      Integer num=tm.get(key); 
      System.out.println("学号:"+num+"  "+"姓名:"+key.name+"  "+"成绩:"+key.grade); 
    } 
  } 
} 
class Student implements Comparable<Student>{ 
  int grade; 
  String name; 
  public Student(int grade,String name){ 
    this.grade =grade; 
    this.name=name; 
  } 
  @Override 
  public int compareTo(Student o) { 
    if(this.grade>o.grade)  
      return 1;  
      if(this.grade==o.grade)  
      { //Al igual que las puntuaciones, se ordena según el nombre 
       return this.name.compareTo(o.name);  
      }  
      return -1;  
  } 
} 

 El resultado de la salida es:

Número de matrícula:20070303    Nombre: Estudiante12    Puntuación:61
Número de matrícula:20070323    Nombre: Estudiante32    Puntuación:61
Número de matrícula:20070317    Nombre: Estudiante26    Puntuación:62
Número de matrícula:20070309    Nombre: Estudiante18    Puntuación:64
Número de matrícula:20070301    Nombre: Estudiante10    Puntuación:67
Número de matrícula:20070304    Nombre: Estudiante13    Puntuación:69
Número de matrícula:20070322    Nombre: Estudiante31    Puntuación:69
Número de matrícula:20070328    Nombre: Estudiante37    Puntuación:70
Número de matrícula:20070305    Nombre: Estudiante14    Puntuación:71
Número de matrícula:20070319    Nombre: Estudiante28    Puntuación:73
Número de matrícula:20070321    Nombre: Estudiante30 Puntuación:74
Número de matrícula:20070310    Nombre: Estudiante19    Puntuación:81
Número de matrícula:20070315    Nombre: Estudiante24    Puntuación:82
Número de matrícula:20070307    Nombre: Estudiante16    Puntuación:84
Número de matrícula:20070330 Nombre: Estudiante39    Puntuación:84
Número de matrícula:20070312    Nombre: Estudiante21    Puntuación:85
Número de matrícula:20070324    Nombre: Estudiante33    Puntuación:87
Número de matrícula:20070306    Nombre: Estudiante15    Puntuación:88
Número de matrícula:20070308    Nombre: Estudiante17    Puntuación:90
Número de matrícula:20070327    Nombre: Estudiante36    Puntuación:90
Número de matrícula:20070318    Nombre: Estudiante27    Puntuación:91
Número de matrícula:20070316    Nombre: Estudiante25    Puntuación:92
Número de matrícula:20070320 Nombre: Estudiante29    Puntuación:92
Número de matrícula:20070314    Nombre: Estudiante23    Puntuación:93
Número de matrícula:20070313    Nombre: Estudiante22    Puntuación:94
Número de matrícula:20070302    Nombre: Estudiante11    Puntuación:95
Número de matrícula:20070325    Nombre: Estudiante34    Puntuación:95
Número de matrícula:20070329    Nombre: Estudiante38    Puntuación:97
Número de matrícula:20070326    Nombre: Estudiante35    Puntuación:98
Número de matrícula:20070311    Nombre: Estudiante20 Puntuación:99

ParaTreeMapResumen:
1Por defecto, TreeMap ordena las claves, por lo que se puede insertar un objeto personalizado en la clave, y poner el entero que representa el número de matrícula en el valor. Al ordenar las claves, se puede especificar alguna propiedad del objeto personalizado para el ordenamiento.
2Uso del método put() para agregar elementos a la colección Map.
3Principio de extracción de la colección Map: convierte la colección map en una colección set y luego extrae mediante el iterador. Dos formas de extraer la colección map:
(1Set<k> keySet:Almacena todas las claves del map en la colección Set. Porque el set tiene un iterador. Por lo tanto, se puede extraer todas las claves de manera iterativa y obtener el valor correspondiente de cada clave según el método get.
(2Set<Map.Entry<k,v>> entrySet:La relación de mapeo de la colección map se ha almacenado en la colección set, y el tipo de datos de esta relación es: Map.Entry

Esto es todo el contenido del artículo, espero que ayude en su aprendizaje y que todos los demás apoyen el tutorial de clamor.

Declaración: El contenido de este artículo se ha obtenido de Internet, pertenece al propietario original, se ha contribuido y subido por los usuarios de Internet de manera voluntaria. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar y proporcionar evidencia. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará