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 باستخدام طريقة sort() من 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), "زميل" + 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; } }
النتيجة كما في الشكل التالي:
لإطار العمل Listالخلاصة:
1- مجموعة List هي في الواقع مجموعة ديناميكية من الأعداد، يمكن استخراج العناصر منها مباشرة من خلال حلقة 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،new class مقارن) 方法. لذا يجب تعريف كلاً من مقارن، بتحديد قواعد المقارنة الخاصة بك.
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; } }
输出结果为:
الرقم التسلسلي: 20070307 الاسم: الطالب 16 الدرجات: 60
الرقم التسلسلي: 20070309 الاسم: الطالب 18 الدرجات: 60
الرقم التسلسلي: 20070314 الاسم: الطالب 23 الدرجات: 61
الرقم التسلسلي: 20070318 الاسم: الطالب 27 الدرجات: 61
الرقم التسلسلي: 20070322 الاسم: الطالب 31 الدرجات: 61
الرقم التسلسلي: 20070306 الاسم: الطالب 15 الدرجات: 62
الرقم التسلسلي: 20070310 الاسم: الطالب 19 الدرجات: 64
الرقم التسلسلي: 20070302 الاسم: الطالب 11 الدرجات: 66
الرقم التسلسلي: 20070308 الاسم: الطالب 17 الدرجات: 68
الرقم التسلسلي: 20070321 الاسم: الطالب 30 الدرجات: 68
الرقم التسلسلي: 20070330 الاسم: الطالب 39 الدرجات: 69
الرقم التسلسلي: 20070303 الاسم: الطالب 12 الدرجات: 70
الرقم التسلسلي: 20070320 الاسم: الطالب 29 الدرجات: 70
رقم الجلوس: 20070323 اسم: الطالب 32 الدرجات: 77
رقم الجلوس: 20070313 اسم: الطالب 22 الدرجات: 78
رقم الجلوس: 20070304 اسم: الطالب 13 الدرجات: 79
رقم الجلوس: 20070324 اسم: الطالب 33 الدرجات: 83
رقم الجلوس: 20070326 اسم: الطالب 35 الدرجات: 84
رقم الجلوس: 20070327 اسم: الطالب 36 الدرجات: 85
رقم الجلوس: 20070311 اسم: الطالب 20 الدرجات: 88
رقم الجلوس: 20070305 اسم: الطالب 14 الدرجات: 89
رقم الجلوس: 20070329 اسم: الطالب 38 الدرجات: 89
رقم الجلوس: 20070316 اسم: الطالب 25 الدرجات: 90
رقم الجلوس: 20070301 اسم: الطالب 10 الدرجات: 95
رقم الجلوس: 20070312 اسم: الطالب 21 الدرجات: 96
رقم الجلوس: 20070317 اسم: الطالب 26 الدرجات: 97
رقم الجلوس: 20070319 اسم: الطالب 28 الدرجات: 97
رقم الجلوس: 20070325 اسم: الطالب 34 الدرجات: 98
رقم الجلوس: 20070315 اسم: الطالب 24 الدرجات: 99
رقم الجلوس: 20070328 اسم: الطالب 37 الدرجات: 99
علىTreeSetالنتيجة:
1-لا يمكن أن يكون العنصر مكررًا، وتكون TreeSet منتهية الترتيب.
2-طرق الترتيب الاثنين:
(1) إنشاء فئة مقارنة مخصصة، مثل class Com implements Comparator { }، وتنفيذ دالة compare(Object o1, Object o2) فيها لتحديد قواعد المقارنة.
(2) تعطيل العنصر الذاتي الخاص بالتقييم.
الخطوات: تحديد العنصر الذي يتم إضافته إلى TreeSet لتنفيذ واجهة Comparable وتغطية دالة compareTo. هذا الترتيب هو ترتيب العنصر الطبيعي، أو يُدعى أيضًا ترتيب افتراضي.
الفرق بين الطريقة 1 والطريقة 2:
لدي كل طريقة مزايا وعيوب، فإن استخدام Comparable بسيط، فقط تحتاج إلى تنفيذ واجهة Comparable للعنصر لتصبح قابلًا للمقارنة، ولكن يجب تعديل الكود المصدر.
فوائد استخدام Comparator هو أنه لا يتطلب تعديل الكود المصدر، بل يتم إنشاء مقارن إضافي، عند الحاجة إلى مقارنة أي عنصر مخصص، يتم إرسال المقارن والعنصر معًا للقيام بالمقارنة، بالإضافة إلى ذلك يمكن للمستخدم تنفيذ منطق معقد يمكن التعميم فيه، مما يمكنه من التطابق مع بعض العناصر البسيطة، مما يمكنه من توفير الكثير من العمل المكرر.
(2)استخدامHashSetلتحقيق
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النتيجة:
لا يمكن تكرار العناصر في HashSet، إذا تم إضافة تكرار، فإنه سيظهر فقط واحد.
النظام التالي هو:
HashSet: هيكل البيانات الأساسي هو جدول تبديلي. غير آمن للتعامل المتسلسل. غير متزامن.
كيف يضمن 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; } }
输出结果为:
学号: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
رقم التسجيل: 20070325 اسم: الطلاب 34 درجة: 95
رقم التسجيل: 20070329 اسم: الطلاب 38 درجة: 97
رقم التسجيل: 20070326 اسم: الطلاب 35 درجة: 98
رقم التسجيل: 20070311 اسم: الطلاب 20 درجة: 99
علىTreeMapالنتيجة:
1- يتم ترتيب TreeMap افتراضياً للمفاتيح، لذا يمكن وضع أوبجكتات مخصصة في المفتاح، ووضع نوع بيانات أرقام الطلاب في القيمة. يمكن تحديد ترتيب المفاتيح عن طريق تحديد خاصية معينة في الأوبجكت المخصص.
2- إضافة العناصر إلى مجموعة Map باستخدام طريقة put().
3- مبدأ استخراج مجموعة Map: تحويل مجموعة Map إلى مجموعة Set. ثم يتم استخراجها باستخدام م迭代ر. طرق استخراج اثنين من مجموعة Map:
(1) Set<k> keySet:تم حفظ جميع المفاتيح في مجموعة Set. لأن مجموعة Set تحتوي على م迭代ر. يمكن سحب جميع المفاتيح باستخدام الطريقة get. للحصول على القيمة المحددة لكل مفتاح.
(2) Set<Map.Entry<k,v>> entrySet:تم حفظ علاقات الت映射 من مجموعة map في مجموعة set، وقد كان نوع البيانات لهذه العلاقات هو: Map.Entry
هذا هو نهاية محتوى هذا المقال، آمل أن يكون قد ساعد في تعلم الجميع، وآمل أن يتم دعم دروس الصراخ بشكل كبير.
بيان: محتوى هذا المقال تم جمعه من الإنترنت، حقوق الطبع والتأليف مملوكة للمالك الأصلي، المحتوى تم تقديمه من قبل مستخدمي الإنترنت بشكل تلقائي، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل أي مسؤولية قانونية مرتبطة بذلك. إذا وجدت محتوى يشتبه في انتهاك حقوق الطبع والتأليف، يرجى إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال '#' بـ '@') للإبلاغ، وقدم الدليل على ذلك، إذا تم التحقق من ذلك، سيتم حذف المحتوى المشبوه فوراً.