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

Задача по Java Collection Framework с несколькими способами решения

Вопрос:У 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 (во время отправки письма замените # на @) для сообщения о нарушении,并提供 соответствующие доказательства. Если будет установлено, что материал нарушает авторские права, сайт немедленно удалил涉嫌侵权的内容.

Давай посмотрим!