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

一道Java集合框架题 多种解题思路

问题:某班30个学生的学号为20070301-20070330,全部选修了Java程序设计课程,给出所有同学的成绩(可用随机数产生,范围60-100),请编写程序将本班各位同学的成绩按照从低到高排序打印输出。

要求:分别用List、Map、Set来实现,打印的信息包括学号、姓名和成绩。

1、使用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){ 
    /* 此处用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), "同学"+j)); 
    } 
    //ArrayList排序借助Collections中的sort()方法实现。 
    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), "同学"+j)); 
    } 
    //对链表排序 
    Collections.sort(lt, new Sortbygrade()); 
    //输出链表 
    for(Student sd:lt) 
      System.out.println(sd); 
  } 
} 
//Student class 
class Student{ 
  int num,grade; 
  String name; 
  //构造函数 
  public Student(int num,int grade,String name){ 
    this.num=num; 
    this.name=name; 
    this.grade=grade; 
  } 
  //此处必须覆盖 
  public String toString(){ 
//   System.out.println("hi"); 
    return "编号:"+this.num+"\t"+"姓名:"+this.name+"  "+"成绩:"+this.grade; 
  } 
} 
//创建一个比较器类 
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;     
  } 
} 

 输出结果如图:

关于List集合框架的总结:

1、List集合实际上是一个动态数组,元素可以直接通过for循环取出,而不需要迭代。
2、当输出List集合时,会默认调用集合中存储对象的toString()方法,因此需要在类中进行覆盖。
Se non si sovrascrive il metodo toString( ), è necessario utilizzare

for(int i=0;i<lt.size();i++) 
{ 
  Student s=lt.get(i); 
  System.out.println("编号:"+s.num+"  姓名:"+s.name+"  成绩:"+s.grade); 
} 

3、L'ordinamento della lista richiede l'uso della classe Collections, ovvero Collections.Sort(list, new classe comparatore()) metodo. Pertanto, è necessario definire una classe comparatore personalizzata per definire le proprie regole di confronto.

2、Utilizzare la集合 Set per implementare
(1) Utilizzare TreeSet per implementare

package com.package1; 
import java.util.*; 
public class StuScore { 
public static void main(String[] args) { 
  TreeSet<Student> ts=new TreeSet<Student>(new Com()); 
  //Add elements inside 
  for(int i=20070301,j=1;i<=20070330;i++,j++) 
  { 
    ts.add(new Student(i,"Studente"+j,(int) (40*Math.random()+60))); 
  } 
  //Iterazione ciclica di estrazione 
  Iterator<Student> it=ts.iterator(); 
  while(it.hasNext()) 
  { 
    Student o1=it.next(); 
    System.out.println("Matricola: "+o1.num+" "+"Nome: "+o1.name+" "+" "+"Punteggio: "+o1.grade); 
  } 
} 
} 
//Student class 
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.num)); 
  } 
  return 0; 
} 
} 

输出结果为:

Matricola: 20070307 Nome: Studente 16 Punteggio: 60
Matricola: 20070309 Nome: Studente 18 Punteggio: 60
Matricola: 20070314 Nome: Studente 23 Punteggio: 61
Matricola: 20070318 Nome: Studente 27 Punteggio: 61
Matricola: 20070322 Nome: Studente 31 Punteggio: 61
Matricola: 20070306 Nome: Studente 15 Punteggio: 62
Matricola: 20070310 Nome: Studente 19 Punteggio: 64
Matricola: 20070302 Nome: Studente 11 Punteggio: 66
Matricola: 20070308 Nome: Studente 17 Punteggio: 68
Matricola: 20070321 Nome: Studente 30 Punteggio: 68
Matricola: 20070330 Nome: Studente 39 Punteggio: 69
Matricola: 20070303 Nome: Studente 12 Punteggio: 70
Matricola: 20070320 Nome: Studente 29 Punteggio: 70
Numero di matricola: 20070323 Nome: Studente 32 Punteggio: 77
Numero di matricola: 20070313 Nome: Studente 22 Punteggio: 78
Numero di matricola: 20070304 Nome: Studente 13 Punteggio: 79
Numero di matricola: 20070324 Nome: Studente 33 Punteggio: 83
Numero di matricola: 20070326 Nome: Studente 35 Punteggio: 84
Numero di matricola: 20070327 Nome: Studente 36 Punteggio: 85
Numero di matricola: 20070311 Nome: Studente 20 Punteggio: 88
Numero di matricola: 20070305 Nome: Studente 14 Punteggio: 89
Numero di matricola: 20070329 Nome: Studente 38 Punteggio: 89
Numero di matricola: 20070316 Nome: Studente 25 Punteggio: 90
Numero di matricola: 20070301 Nome: Studente 10 Punteggio: 95
Numero di matricola: 20070312 Nome: Studente 21 Punteggio: 96
Numero di matricola: 20070317 Nome: Studente 26 Punteggio: 97
Numero di matricola: 20070319 Nome: Studente 28 Punteggio: 97
Numero di matricola: 20070325 Nome: Studente 34 Punteggio: 98
Numero di matricola: 20070315 Nome: Studente 24 Punteggio: 99
Numero di matricola: 20070328 Nome: Studente 37 Punteggio: 99

PerTreeSetLa nostra sintesi:
1. Gli elementi non possono essere ripetuti e TreeSet è ordinato.
2. Due metodi di ordinamento:
(1) Creare una classe comparatore personalizzata, ad esempio class Com implements Comparator { }, implementare il metodo compare(Object o1, Object o2) e definire le regole di confronto all'interno di esso.
(2) Far diventare l'elemento stesso comparabile.
Passaggi: Implementare l'interfaccia Comparable per l'elemento aggiunto a TreeSet e sovrascrivere il metodo compareTo. Questa sequenza è anche l'ordine naturale degli elementi, o chiamata ordine predefinito.

La differenza tra il metodo 1 e il metodo 2:

Le due metodologie hanno i loro pro e contro. Usare Comparable è semplice, poiché un oggetto che implementa l'interfaccia Comparable diventa direttamente un oggetto confrontabile, ma è necessario modificare il codice sorgente.

I vantaggi dell'uso di Comparator sono che non è necessario modificare il codice sorgente, ma implementare un altro comparatore. Quando un oggetto personalizzato deve essere confrontato, è sufficiente passare il comparatore e l'oggetto insieme per confrontare le dimensioni. Inoltre, l'utente può implementare logiche complesse e comuni all'interno di Comparator, in modo che possa abbinare alcuni oggetti semplici, risparmiando così molte attività ripetitive.

(2) UsingHashSetto implement

package com.package1; 
import java.util.*; 
public class StuScore { 
  public static void main(String[] args) { 
    HashSet<Student> hs=new HashSet<Student>(); 
    //Add elements inside 
    for(int i=20070301,j=1;i<=20070330;i++,j++) 
    { 
      hs.add(new Student(i,"Student"+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); 
  } 
} 
//Student class 
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 "Student ID: " + this.num + "\t" + "Name: " + this.name 
+"  "+"Score:"+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; 
  } 
} 

The output result is as follows:
Student ID: 20070310 Name: 同学19 Score: 60
Student ID: 20070330 Name: 同学39 Score: 62
Matricola: 20070326 Nome: Studente 35 Punteggio: 63
Matricola: 20070317 Nome: Studente 26 Punteggio: 64
Matricola: 20070318 Nome: Studente 27 Punteggio: 65
Matricola: 20070322 Nome: Studente 31 Punteggio: 65
Matricola: 20070301 Nome: Studente 10 Punteggio: 67
Matricola: 20070328 Nome: Studente 37 Punteggio: 68
Matricola: 20070304 Nome: Studente 13 Punteggio: 68
Matricola: 20070319 Nome: Studente 28 Punteggio: 69
Matricola: 20070313 Nome: Studente 22 Punteggio: 70
Matricola: 20070303 Nome: Studente 12 Punteggio: 71
Matricola: 20070312 Nome: Studente 21 Punteggio: 71
Matricola: 20070329 Nome: Studente 38 Punteggio: 72
Matricola: 20070306 Nome: Studente 15 Punteggio: 72
Matricola: 20070324 Nome: Studente 33 Punteggio: 72
Matricola: 20070305 Nome: Studente 14 Punteggio: 75
Matricola: 20070315 Nome: Studente 24 Punteggio: 75
Matricola: 20070314 Nome: Studente 23 Punteggio: 78
Matricola: 20070307 Nome: Studente 16 Punteggio: 80
Matricola: 20070311 Nome: Studente 20 Punteggio: 81
Matricola: 20070302 Nome: Studente 11 Punteggio: 83
Matricola: 20070309 Nome: Studente 18 Punteggio: 84
Matricola: 20070320 Nome: Studente 29 Punteggio: 85
Matricola: 20070321 Nome: Studente 30 Punteggio: 85
Matricola: 20070316 Nome: Studente 25 Punteggio: 86
Matricola: 20070327 Nome: Studente 36 Punteggio: 90
Matricola: 20070308 Nome: Studente 17 Punteggio: 94
Matricola: 20070323 Nome: Studente 32 Punteggio: 94
Matricola: 20070325 Nome: Studente 34 Punteggio: 95

PerHashSetLa nostra sintesi:
1. Gli elementi in HashSet non possono essere ripetuti. Se si aggiunge una duplicazione, verrà visualizzato solo uno.
Il principio è il seguente:
HashSet: La struttura dati sottostante è una tabella hash. È non sicura per le thread. Non sincronizzata.
Come garantisce HashSet l'unicità degli elementi?
Risposta: Viene fatto attraverso due metodi dell'elemento, hashCode e equals.
Se l'hashcode degli elementi è uguale, allora si verifica se equals è true. Se l'hashcode degli elementi è diverso, non si chiama 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,"amico"+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)  
      { //当成绩相同时,按照姓名排序 
       return this.name.compareTo(o.name);  
      }  
      return -1;  
  } 
} 

 输出结果为:

学号:20070303    姓名:同学12    成绩:61
学号:20070323    姓名:同学32    成绩:61
学号:20070317    姓名:同学26    成绩:62
学号:20070309    姓名:同学18    成绩:64
学号:20070301    姓名:同学10    成绩:67
学号:20070304    姓名:同学13    成绩:69
学号:20070322    姓名:同学31    成绩:69
学号:20070328    姓名:同学37    成绩:70
学号:20070305    姓名:同学14    成绩:71
学号:20070319    姓名:同学28    成绩:73
学号:20070321    姓名:同学30    成绩:74
学号:20070310    姓名:同学19    成绩:81
学号:20070315    姓名:同学24    成绩:82
学号:20070307    姓名:同学16    成绩:84
学号:20070330    姓名:同学39    成绩:84
学号:20070312    姓名:同学21    成绩:85
学号:20070324    姓名:同学33    成绩:87
学号:20070306    姓名:同学15    成绩:88
学号:20070308    姓名:同学17    成绩:90
学号:20070327    姓名:同学36    成绩:90
学号:20070318    姓名:同学27    成绩:91
学号:20070316    姓名:同学25    成绩:92
学号:20070320    姓名:同学29    成绩:92
学号:20070314    姓名:同学23    成绩:93
学号:20070313    姓名:同学22    成绩:94
学号:20070302    姓名:同学11    成绩:95
Numero di matricola: 20070325      Nome: studente 34      Punteggio: 95
Numero di matricola: 20070329      Nome: studente 38      Punteggio: 97
Numero di matricola: 20070326      Nome: studente 35      Punteggio: 98
Numero di matricola: 20070311      Nome: studente 20      Punteggio: 99

PerTreeMapLa nostra sintesi:
1. TreeMap di default ordina i key, quindi è possibile inserire oggetti personalizzati nei key, inserendo l'intero rappresentante il numero di matricola nel value. Durante l'ordinamento dei Key, è possibile specificare un attributo dell'oggetto personalizzato per l'ordinamento.
2. Aggiungi elementi alla raccolta Map utilizzando il metodo put().
3. Il principio di estrazione della raccolta Map: trasforma la raccolta Map in una raccolta Set e estrai attraverso l'iteratore. Due modi di estrazione della raccolta Map:
(1) Set<k> keySet:Memorizza tutte le chiavi del map nella raccolta Set. Poiché set ha un iteratore, è possibile estrarre tutte le chiavi in modo iterativo e ottenere il valore corrispondente di ogni chiave utilizzando il metodo get.
(2) Set<Map.Entry<k,v>> entrySet:La relazione di mappatura della raccolta map è stata memorizzata nella raccolta set, e il tipo dei dati di questa relazione è: Map.Entry

Questo è tutto il contenuto dell'articolo, speriamo che sia utile per la tua apprendimento e che tu sostenga fortemente il tutorial di urlaio.

Dichiarazione: il contenuto di questo articolo è stato raccolto da Internet, il copyright spetta ai rispettivi proprietari, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.