English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
问题:某班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.