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) возврат 1; if(s1.grade<s2.grade) возврат -1; if(s1.grade==s2.grade) return s1.name.compareTo(s2.name); return 0; } }
Результат вывода показан на рисунке:
О рамке ListЗаключение:
1、Список List на самом деле является динамическим массивом, элементы которого можно извлечь напрямую через цикл for, не needing итерации.
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 Класс_сравнения()) . Поэтому необходимо определить класс сравнения, определяющий свои правила сравнения.
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) возврат 1; if(s1.grade<s2.grade) возврат -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) Дайте элементам самим обладать способностью к сравнению.
Шаги: реализуйте интерфейс Comparable для элементов, добавляемых в TreeSet, и覆盖ьте метод 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) возврат 1; if(s1.grade<s2.grade) возврат -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)} возврат 1; if(this.grade==o.grade) { //При равных оценках, сортировка по имени возврат this.name.compareTo(o.name); } возврат -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. Добавление элементов в мап-сету с помощью метода put().
3. Принцип извлечения мап-сета: преобразование мап-сета в сэт-сету. Затем через итератор извлекается. Два способа извлечения мап-сета:
(1) Set<k> keySet:Все ключи из мап-сета добавлены в сэт-сету. Поскольку сэт имеет итератор, можно итеративно извлечь все ключи и получить соответствующие значения с помощью метода get.
(2) Set<Map.Entry<k,v>> entrySet:Мап-сета из мап-сета в сэт-сету, а тип данных этой связи - это: Map.Entry
Это конец статьи, надеюсь, она поможет вам в изучении. Также надеюсь, что вы будете активно поддерживать учебник Yana.
Заявление: контент статьи взят из Интернета, авторские права принадлежат соответствующему автору, контент предоставлен пользователями Интернета в добровольном порядке, сайт не имеет права собственности, не был отредактирован вручную и не несет ответственности за соответствующие юридические обязательства. Если вы обнаружите подозрительный контент, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @) для сообщения о нарушении,并提供 соответствующие доказательства. Если будет установлено, что материал нарушает авторские права, сайт немедленно удалил涉嫌侵权的内容.