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

Ein Beispiel für eine Frage des Java-Kollektivrahmens: Mehrere Lösungsansätze

问题:某班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); 
  } 
} 
//Studienklasse 
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 "Studentennummer:"+this.num+"\t"+"Name:"+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、Bei der Ausgabe der List-Kollektion wird standardmäßig die toString() -Methode des im Kollektion gespeicherten Objekts aufgerufen, daher muss in der Klasse eine Überschreibung vorgenommen werden.
Wenn die toString() -Methode nicht überschrieben wird, muss

for(int i=0;i<lt.size();i++) 
{ 
  Student s=lt.get(i); 
  System.out.println("学号:"+s.num+"  Name:",+s.name+"  Noten:",+s.grade); 
} 

3、Die Sortierung der List-Kollektionen erfordert die Verwendung des Collections-Tools, d.h. Collections.Sort(list, new Comparator-Klasse())-Methode. Daher muss eine benutzerdefinierte Comparator-Klasse definiert und Ihre eigenen Vergleichsregeln definiert werden.

2、Verwenden Sie Set-Kollektionen, um dies zu erreichen
(1)Verwenden Sie TreeSet, um dies zu erreichen

package com.package1; 
um dies zu erreichen*; 
import java.util. 
public static void main(String[] args) { 
  TreeSet<Student> ts=new TreeSet<Student>(new Com()); 
  //HashSet<Student> hs=new HashSet<Student>(); 
  for(int i=20070301,j=1;i<=20070330;i++,j++) 
  { 
    ts.add(new Student(i,"Schüler"+j,(int) (40*Math.random()+60))); 
  } 
  //Iteratives Durchlaufen, um herauszunehmen 
  Iterator<Student> it=ts.iterator(); 
  while(it.hasNext()) 
  { 
    Student o1=it.next(); 
    System.out.println("学号:"+o1.num+" ",+"姓名:"+o1.name+" ",+" ",+"Noten:",+o1.grade); 
  } 
} 
} 
//Studienklasse 
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; 
} 
} 

Ausgabeergebnis:

Schulnummer:20070307  Name: Schüler16    Noten:60
Schulnummer:20070309  Name: Schüler18    Noten:60
Schulnummer:20070314  Name: Schüler23    Noten:61
Schulnummer:20070318  Name: Schüler27    Noten:61
Schulnummer:20070322  Name: Schüler31    Noten:61
Schulnummer:20070306  Name: Schüler15    Noten:62
Schulnummer:20070310  Name: Schüler19    Noten:64
Schulnummer:20070302  Name: Schüler11    Noten:66
Schulnummer:20070308  Name: Schüler17    Noten:68
Schulnummer:20070321  Name: Schüler30  Noten:68
Schulnummer:20070330  Name: Schüler39    Noten:69
Schulnummer:20070303  Name: Schüler12    Noten:70
Schulnummer:20070320  Name: Schüler29    Noten:70
Schulnummer:20070323  Name: Schüler32    Noten:77
Schulnummer:20070313  Name: Schüler22    Noten:78
Schulnummer:20070304  Name: Schüler13    Noten:79
Schulnummer:20070324  Name: Schüler33    Noten:83
Schulnummer:20070326  Name: Schüler35    Noten:84
Schulnummer:20070327  Name: Schüler36    Noten:85
Schulnummer:20070311  Name: Schüler20  Noten:88
Schulnummer:20070305  Name: Schüler14    Noten:89
Schulnummer:20070329  Name: Schüler38    Noten:89
Schulnummer:20070316  Name: Schüler25    Noten:90
Schulnummer:20070301  Name: Schüler10    Noten:95
Schulnummer:20070312  Name: Schüler21    Noten:96
Schulnummer:20070317  Name: Schüler26    Noten:97
Schulnummer:20070319  Name: Schüler28    Noten:97
Schulnummer:20070325  Name: Schüler34    Noten:98
Schulnummer:20070315  Name: Schüler24    Noten:99
Schulnummer:20070328  Name: Schüler37    Noten:99

zuTreeSetZusammenfassung:
1、Die Elemente dürfen nicht dupliziert werden, und TreeSet ist sortiert.
2、Zwei Sortiermethoden:
(1)Definieren Sie eine benutzerdefinierte Comparator-Klasse, z.B. class Com implements Comparator{ } , implementieren Sie compare(Object o1, Object o2)Definieren Sie die Vergleichsregeln in der Methode.
(2)Geben Sie den Elementen selbst eine Vergleichbarkeit.
Schritte: Implementieren Sie das Comparable-Interface für die in den TreeSet hinzugefügten Elemente und überschreiben Sie die compareTo-Methode. Diese Reihenfolge ist auch die natürliche Reihenfolge der Elemente, oder auch Standardreihenfolge genannt.

Methode1und Methode2Unterschiede:

Beide Methoden haben ihre Vor- und Nachteile. Die Verwendung von Comparable ist einfach, ein Objekt, das das Comparable-Interface implementiert, wird direkt zu einem vergleichbaren Objekt, aber es muss die Quellcode geändert werden.

(2Der Vorteil der Verwendung von Comparator ist, dass es nicht notwendig ist, die Quelldatei zu ändern, sondern eine weitere Comparator zu implementieren. Wenn ein benutzerdefiniertes Objekt verglichen werden muss, wird der Comparator zusammen mit dem Objekt übergeben, um die Größenverhältnisse zu bestimmen. Und der Benutzer kann im Comparator selbst komplexe und allgemeine Logiken implementieren, um einfache Objekte zu passen. Dies kann viele wiederholte Arbeiten sparen.}HashSet)使用

package com.package1; 
um dies zu erreichen*; 
import java.util. 
  public static void main(String[] args) { 
    public class StuScore { 
    //HashSet<Student> hs=new HashSet<Student>(); 
    for(int i=20070301,j=1;i<=20070330;i++,j++) 
    { 
      hs.add(new Student(i,"Schüler"+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); 
  } 
} 
//Studienklasse 
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 "Studentennummer:"+this.num+"\t"+"Name:"+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; 
  } 
} 

Das Ausgabergebnis ist wie folgt:
Schulnummer:20070310 Name: Schüler19    Noten:60
Schulnummer:20070330 Name: Schüler39    Noten:62
Schulnummer:20070326 Name: Schüler35    Noten:63
Schulnummer:20070317 Name: Schüler26    Noten:64
Schulnummer:20070318 Name: Schüler27    Noten:65
Schulnummer:20070322 Name: Schüler31    Noten:65
Schulnummer:20070301 Name: Schüler10    Noten:67
Schulnummer:20070328 Name: Schüler37    Noten:68
Schulnummer:20070304 Name: Schüler13    Noten:68
Schulnummer:20070319 Name: Schüler28    Noten:69
Schulnummer:20070313 Name: Schüler22    Noten:70
Schulnummer:20070303 Name: Schüler12    Noten:71
Schulnummer:20070312 Name: Schüler21    Noten:71
Schulnummer:20070329 Name: Schüler38    Noten:72
Schulnummer:20070306 Name: Schüler15    Noten:72
Schulnummer:20070324 Name: Schüler33    Noten:72
Schulnummer:20070305 Name: Schüler14    Noten:75
Schulnummer:20070315 Name: Schüler24    Noten:75
Schulnummer:20070314 Name: Schüler23    Noten:78
Schulnummer:20070307 Name: Schüler16    Noten:80
Schulnummer:20070311 Name: Schüler20    Noten:81
Schulnummer:20070302 Name: Schüler11    Noten:83
Schulnummer:20070309 Name: Schüler18    Noten:84
Schulnummer:20070320 Name: Schüler29    Noten:85
Schulnummer:20070321 Name: Schüler30    Noten:85
Schulnummer:20070316 Name: Schüler25    Noten:86
Schulnummer:20070327 Name: Schüler36    Noten:90
Schulnummer:20070308 Name: Schüler17    Noten:94
Schulnummer:20070323 Name: Schüler32    Noten:94
Schulnummer:20070325 Name: Schüler34    Noten:95

zuHashSetZusammenfassung:
1Elemente in HashSet dürfen nicht dupliziert werden. Fügt man ein dupliziertes Element hinzu, wird nur eins angezeigt.
Der Prinzip ist wie folgt:
HashSet: Die unterliegende Datenstruktur ist eine Hash-Tabelle. Sie ist nicht threadsicher. Nicht synchronisiert.
2Wie gewährleistet HashSet die Einzigartigkeit der Elemente?
答:是通过元素的两个方法,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)  
      { //Wenn die Noten gleich sind, wird nach dem Namen sortiert 
       return this.name.compareTo(o.name);  
      }  
      return -1;  
  } 
} 

 Ausgabeergebnis:

Schulnummer:20070303    Name: Schüler12    Noten:61
Schulnummer:20070323    Name: Schüler32    Noten:61
Schulnummer:20070317    Name: Schüler26    Noten:62
Schulnummer:20070309    Name: Schüler18    Noten:64
Schulnummer:20070301    Name: Schüler10    Noten:67
Schulnummer:20070304    Name: Schüler13    Noten:69
Schulnummer:20070322    Name: Schüler31    Noten:69
Schulnummer:20070328    Name: Schüler37    Noten:70
Schulnummer:20070305    Name: Schüler14    Noten:71
Schulnummer:20070319    Name: Schüler28    Noten:73
Schulnummer:20070321    Name: Schüler30    Noten:74
Schulnummer:20070310    Name: Schüler19    Noten:81
Schulnummer:20070315    Name: Schüler24    Noten:82
Schulnummer:20070307    Name: Schüler16    Noten:84
Schulnummer:20070330    Name: Schüler39    Noten:84
Schulnummer:20070312    Name: Schüler21    Noten:85
Schulnummer:20070324    Name: Schüler33    Noten:87
Schulnummer:20070306    Name: Schüler15    Noten:88
Schulnummer:20070308    Name: Schüler17    Noten:90
Schulnummer:20070327    Name: Schüler36    Noten:90
Schulnummer:20070318    Name: Schüler27    Noten:91
Schulnummer:20070316    Name: Schüler25    Noten:92
Schulnummer:20070320    Name: Schüler29    Noten:92
Schulnummer:20070314    Name: Schüler23    Noten:93
Schulnummer:20070313    Name: Schüler22    Noten:94
Schulnummer:20070302    Name: Schüler11    Noten:95
Schulnummer:20070325    Name: Schüler34    Noten:95
Schulnummer:20070329    Name: Schüler38    Noten:97
Schulnummer:20070326    Name: Schüler35    Noten:98
Schulnummer:20070311    Name: Schüler20    Noten:99

zuTreeMapZusammenfassung:
1、TreeMap sortiert die Schlüssel standardmäßig, daher können benutzerdefinierte Objekte in die Schlüssel eingefügt werden, und die Integer, die die Schulnummer darstellen, werden in die Werte eingefügt. Beim Sortieren der Schlüssel kann eine bestimmte Eigenschaft des benutzerdefinierten Objekts angegeben werden, um zu sortieren.
2、Fügen Sie Elemente mit dem put()-Method hinzufügen.
3、Abfrageprinzip des Map-Sets: Das Map-Speicher wird in ein Set-Speicher umgewandelt und dann über den Iterator ausgelesen. Zwei Abfragearten des Map-Speichers:
(1)Set<k> keySet:Speichern Sie alle Schlüssel des Maps in das Set-Speicher. Da Set einen Iterator hat, können alle Schlüssel auf Iterationsweise ausgelesen werden, und die Werte jeder Schlüssel werden über die get-Methode abgerufen.
(2)Set<Map.Entry<k,v>> entrySet:Die Abbildungsverhältnisse des Map-Sets werden in das Set-Set gespeichert, und der Datentyp dieses Verhältnisses ist: Map.Entry

Das ist der gesamte Inhalt dieses Artikels. Wir hoffen, dass er Ihnen bei Ihrem Lernen hilft und dass Sie die呐喊教程 mehr unterstützen.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet entnommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetbenutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte, hat den Inhalt nicht manuell bearbeitet und übernimmt keine rechtlichen Verantwortlichkeiten. Wenn Sie verdächtige urheberrechtliche Inhalte finden, freuen wir uns über eine E-Mail an: notice#oldtoolbag.com (bei der E-Mail-Übermittlung bitte # durch @ ersetzen) zur Meldung von Missbrauch und zur Bereitstellung relevanter Beweise. Bei nachgewiesener Urheberrechtsverletzung wird diese Website die fraglichen Inhalte sofort löschen.

Empfohlene Artikel