質問: クラスには学生番号 20070301 ~ 20070330 の学生が 30 人います。全員が Java プログラミング コースを受講しました (60 ~ 100 の範囲の乱数を生成できます)。このクラスのすべての生徒のスコアを次の項目に割り当てるプログラム。スコアは低いものから高いものの順に印刷されます。
要件: それぞれ、リスト、マップ、およびセットを使用して実装します。印刷される情報には、学生番号、名前、成績が含まれます。
1. リストコレクションを使用して
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); } } //学生类 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; } }
を実装します。出力結果は次の図のようになります。
リストコレクションフレームワークの概要:
1. リストコレクションは実際には動的配列であり、要素を取得できます。 for ループを介して直接出力します。反復は必要ありません。
2. List コレクションを出力する場合、コレクションに格納されているオブジェクトの toString() メソッドがデフォルトで呼び出されるため、クラス内でオーバーライドする必要があります。
toString() メソッドをオーバーライドしない場合は、
for(int i=0;i<lt.size();i++) { Student s=lt.get(i); System.out.println("学号:"+s.num+" 姓名:"+s.name+" 成绩:"+s.grade); }
3 を使用する必要があります。List コレクションの並べ替えには、Collections ツール クラス、つまり Collections.Sort (list、新しいコンパレータ クラス) の助けが必要です。 ()) 方法。したがって、コンパレータ クラスをカスタマイズし、独自の比較ルールを定義する必要があります。
2. Setコレクションを使用して
を実装する (1) TreeSetを使用して
package com.package1; import java.util.*; public class StuScore { public static void main(String[] args) { TreeSet<Student> ts=new TreeSet<Student>(new Com()); //添加元素进去 for(int i=20070301,j=1;i<=20070330;i++,j++) { ts.add(new Student(i,"同学"+j,(int) (40*Math.random()+60))); } //迭代循环取出 Iterator<Student> it=ts.iterator(); while(it.hasNext()) { Student o1=it.next(); System.out.println("学号:"+o1.num+" "+"姓名:"+o1.name+" "+" "+"成绩:"+o1.grade); } } } //学生类 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; } }
を実装する
出力結果は次のようになります:
名前: クラスメイト 16 スコア: 60
学生ID: 20070309 : クラスメイト 18 スコア: 60
学生 ID: 20070314 名前: クラスメイト 23 スコア: 61
学生 ID: 20070318 名前: クラスメイト 27 スコア: 61
学生 ID: 20070322 名前: クラスメイト 31 スコア: 61
学生 ID: 20070306 名前: クラスメイト1 5 スコア: 62
学生番号: 20070310 名前: クラスメイト 19 取得: 64
学生番号: 20070302 名前: クラスメイト 11 スコア: 66
学生番号: 20070308 名前: クラスメイト 17 取得: 68
学生番号: 20070321 名前: クラスメイト 30結果: 68
学生ID: 20070330 名前: クラスメイト39 スコア: 69
学生ID: 20070303 名前: クラスメイト12 スコア: 70
学生ID: 20070320 名前: クラスメイト29 スコア: 70
学生ID: 20070323 名前: クラスメイト32 スコア: 77
学生番号: 20070313 名前: クラスメイト 22 取得: 78
学生番号: 20070304 名前: クラスメイト 13 取得: 79
学生番号: 20070324 名前: クラスメイト 33 スコア: 83
学生番号: 20070326 名前: クラスメイト 35 スコア: 84
学籍番号:20070327 名前:クラスメイト36 スコア:85
学生ID:20070311 名前:クラスメイト20 スコア:88
学生ID:20070305 名前:クラスメイト14 スコア:89
学生ID:20070329 名前:クラスメイト38 スコア:89
学生ID :2 0070316名前:クラスメート25グレード:90研究番号:20070301名:クラスメート10 gets:95
学生番号:20070312名前:クラスメート21 Gets:96°学生番号:20070317名前:学生26スコア:学生番号:200703199名前: 名前: 名前: 20070319 名前: 名前: クラスメイト 28 学年: 97 成 8 番号: 20070325 名前: クラスメイト 34 取得: 98
学生番号: 20070315 名前: クラスメイト 24 取得: 99
学生番号: 20070328 名前: クラスメイト 37 得点: 99
TreeSet の概要:
11111:
11111: 、要素は繰り返すことができず、TreeSet は順序付けされます。
(1) ComimplementsComparator{ } などのコンパレーター クラスをカスタマイズし、compare(Object o1, Object o2) メソッドを実装し、その中で比較ルールを定義します。
(2) 要素そのものを比較対象にする。
ステップ: TreeSet に追加された要素の Comparable インターフェイスを実装し、compareTo メソッドをオーバーライドします。この順序は要素の自然な順序でもあり、デフォルト順序と呼ばれます。
方法 1 と方法 2 の違い:
どちらの方法にも独自の長所と短所があります。 Comparable インターフェイスを直接実装するオブジェクトが比較可能なオブジェクトになる限り、ソース コードは簡単です。変更されました。
コンパレーターを使用する利点は、ソース コードを変更する必要がなく、カスタム オブジェクトを比較する必要がある場合にコンパレーターとオブジェクトを一緒に渡してサイズを比較できることです。 Comparator では、ユーザーは複雑で汎用的なロジックを自分で実装できるため、比較的単純なオブジェクトと一致させることができ、繰り返しの作業を大幅に節約できます。
package com.package1; import java.util.*; public class StuScore { public static void main(String[] args) { HashSet<Student> hs=new HashSet<Student>(); //添加元素进去 for(int i=20070301,j=1;i<=20070330;i++,j++) { hs.add(new Student(i,"同学"+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); } } //学生类 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 "学号:"+this.num+"\t"+"姓名:"+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; } }を実装する
输出结果如下:
学号:20070310 姓名:同学19 成绩:60
学号:20070330 姓名:同学39 成绩:62
学号:20070326 姓名:同学35 成绩:63
学号:20070317 姓名:同学26 成绩:64
学号:20070318 姓名:同学27 成绩:65
学号:20070322 姓名:同学31 成绩:65
学号:20070301 姓名:同学10 成绩:67
学号:20070328 姓名:同学37 成绩:68
学号:20070304 姓名:同学13 成绩:68
学号:20070319 姓名:同学28 成绩:69
学号:20070313 姓名:同学22 成绩:70
学号:20070303 姓名:同学12 成绩:71
学号:20070312 姓名:同学21 成绩:71
学号:20070329 姓名:同学38 成绩:72
学号:20070306 姓名:同学15 成绩:72
学号:20070324 姓名:同学33 成绩:72
学号:20070305 姓名:同学14 成绩:75
学号:20070315 姓名:同学24 成绩:75
学号:20070314 姓名:同学23 成绩:78
学号:20070307 姓名:同学16 成绩:80
学号:20070311 姓名:同学20 成绩:81
学号:20070302 姓名:同学11 成绩:83
学号:20070309 姓名:同学18 成绩:84
学号:20070320 姓名:同学29 成绩:85
学号:20070321 姓名:同学30 成绩:85
学号:20070316 姓名:同学25 成绩:86
学号:20070327 姓名:同学36 成绩:90
学号:20070308 姓名:同学17 成绩:94
学号:20070323 姓名:同学32 成绩:94
学号:20070325 姓名:同学34 成绩:95
对HashSet的总结:
1、HashSet中的元素不可以重复,如果重复添加,则只会显示一个。
原理如下:
HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
2、HashSet是如何保证元素唯一性的呢?
答:是通过元素的两个方法,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) { //当成绩相同时,按照姓名排序 return this.name.compareTo(o.name); } return -1; } }
输出结果为:
規模ID:20070323名前:クラスメート32スコア:61
studentID:20070317名前:クラスメート26スコア:62℃ID:20070309名前:クラスメート18スコア:64
番号番号: 20070301 名前: クラスメイト 10 スコア: 67
学生 ID: 20070304 名前: クラスメイト 13 スコア: 69
学生 ID: 20070322 名前: クラスメイト 31 スコア: 69
学生 ID: 20070328 名前: クラスメイト 37 スコア: 70
学生 ID: 70305名前: クラスメイト 14 スコア: 71
学生 ID: 20070319 名前: クラスメイト 28 スコア: 73
学生 ID: 20070321 名前: クラスメイト 30 スコア: 74
学生 ID: 20070310 名前: クラスメイト 19 スコア: 81
学生 ID: 20070315 名前:クラスメイト 24 スコア: 82
学生 ID: 20070307 名前: クラスメイト 16 スコア: 84
学生 ID: 20070330 名前: クラスメイト 39 スコア: 84
学生 ID: 20070312 名前: クラスメイト 21 スコア: 85
学生 ID: 2007032 4 名前: クラスメイト33 スコア: 87
学生 ID: 20070306 名前: クラスメイト 15 スコア: 88
学生 ID: 20070308 名前: クラスメイト 17 スコア: 90
学生 ID: 20070327 名前: クラスメイト 36 スコア: 90
学生 ID: 20070318 名前: クラスメイト 27 結果:91
学生ID: 20070316 名前: クラスメイト25 スコア: 92
学生ID: 20070320 名前: クラスメイト29 スコア: 92
学生ID: 20070314 名前: クラスメイト23 スコア: 93
学生ID: 20070313 名前: クラスメイト22 スコア:94
学生ID: 20070302 名前: クラスメイト11 スコア: 95
学生ID: 20070325 名前: クラスメイト34 スコア: 95
学生ID: 20070329 名前: クラスメイト38 スコア: 97
学生ID: 20070326 名前: クラスメイト35 スコア: 98
勉強番号: 20070311 名前: クラスメイト 20 スコア: 99
ツリーマップの概要:
2. Map コレクションは put() メソッドを使用して要素を追加します。
3. マップ コレクションを抽出する原理: マップ コレクションをセット コレクションに変換します。イテレータを通して取り出します。マップ セットを取得する 2 つの方法:
(1) Set14b2ea0061b0064854e2015e9f0ccaf9 keySet: マップ内のすべてのキーを Set コレクションに保存します。 set にはイテレータがあるためです。すべてのキーは、get メソッドに基づいて繰り返し取得できます。各キーに対応する値を取得します。
(2) Setf7c0dd2036bac3679cff141deb226d10>entrySet: マップ コレクション内のマッピング関係をセット コレクションに格納します。この関係のデータ型は次のとおりです: Map.Entry
上記は全体ですこの記事の内容が皆さんの学習に役立つことを願っています。また、皆さんが PHP 中国語 Web サイトをサポートしてくれることを願っています。
Java コレクション フレームワークに関するその他の質問やさまざまな問題解決のアイデアについては、PHP 中国語 Web サイトの関連記事に注目してください。