Heim  >  Artikel  >  Java  >  Eine Frage zum Java Collection Framework mit mehreren Ideen zur Problemlösung

Eine Frage zum Java Collection Framework mit mehreren Ideen zur Problemlösung

高洛峰
高洛峰Original
2017-01-23 16:57:171661Durchsuche

Frage: Es gibt 30 Studenten in einer Klasse, deren Studenten-IDs 20070301-20070330 sind. Sie haben alle den Java-Programmierkurs besucht (bitte können Zufallszahlen zwischen 60 und 100 generiert werden). Schreiben Sie ein Programm, um diese Klasse zuzuweisen. Die Ergebnisse jedes Schülers werden in der Reihenfolge von niedrig nach hoch ausgedruckt.

Anforderungen: Verwenden Sie zur Implementierung jeweils „Liste“, „Karte“ und „Set“. Die gedruckten Informationen umfassen Schülernummer, Name und Noten.

1. Verwenden Sie die Listensammlung, um

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;     
      
  } 
    
}

zu implementieren. Das Ausgabeergebnis ist wie in der Abbildung dargestellt:

一道Java集合框架题 多种解题思路

Zusammenfassung der Liste Sammlungsrahmen:

1. Die List-Sammlung ist eigentlich ein dynamisches Array und Elemente können ohne Iteration direkt durch eine for-Schleife entnommen werden.
2. Bei der Ausgabe einer Listensammlung wird standardmäßig die toString()-Methode der in der Sammlung gespeicherten Objekte aufgerufen und muss daher in der Klasse überschrieben werden.
Wenn Sie die toString()-Methode nicht überschreiben, müssen Sie

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

3 verwenden. Die Sortierung der List-Sammlung erfordert die Hilfe der Collections-Toolklasse ist die Methode Collections.Sort(list, new ComparatorClass()). Daher müssen Sie eine Komparatorklasse anpassen und Ihre eigenen Vergleichsregeln definieren.

2. Verwenden Sie die Set-Sammlung zum Implementieren
(1) Verwenden Sie TreeSet zum Implementieren

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;
}
}

Das Ausgabeergebnis ist:

Studenten-ID: 20070307 Name: Klassenkamerad 16 Punktzahl: 60
Studenten-ID: 20070309 Name: Klassenkamerad 18 Punktzahl: 60
Studenten-ID: 20070314 Name: Klassenkamerad 23 Punktzahl: 61
Studenten-ID: 20070318 Name: Klassenkamerad 27 Punktzahl: 61
Studenten-ID: 20070322 Name: Klassenkamerad 31 Punktzahl: 61
Studenten-ID: 20070306 Name: Klassenkamerad 15 Punktzahl: 62
Studenten-ID: 20070310 Name : Klassenkamerad 19 Punktzahl: 64
Studenten-ID: 20070302 Name: Klassenkamerad 11 Punktzahl: 66
Studenten-ID: 20070308 Name: Klassenkamerad 17 Punktzahl: 68
Studenten-ID: 20070321 Name: Klassenkamerad 30 Punktzahl: 68
Studenten-ID: 20070330 Name: Klassenkamerad 39 Punktzahl: 69
Studenten-ID: 20070303 Name: Klassenkamerad 12 Punktzahl: 70
Studenten-ID: 20070320 Name: Klassenkamerad 29 Punktzahl: 70
Studenten-ID: 20070323 Name: Klassenkamerad 32 Punktzahl: 77
Studenten-ID: 20070313 Name: Klassenkamerad 22 Punktzahl: 78
Studenten-ID: 20070304 Name: Klassenkamerad 13 Punktzahl: 79
Studenten-ID: 20070324 Name: Klassenkamerad 33 Punktzahl: 83
Student ID: 20070326 Name: Klassenkamerad 35 Punktzahl: 84
Studenten-ID: 20070327 Name: Klassenkamerad 36 Punktzahl: 85
Studenten-ID: 20070311 Name: Klassenkamerad 20 Punktzahl: 88
Studenten-ID: 20070305 Name: Klassenkamerad 14 Punktzahl : 89
Studenten-ID: 20070329 Name: Klassenkamerad 38 Punktzahl: 89
Studenten-ID: 20070316 Name: Klassenkamerad 25 Punktzahl: 90
Studenten-ID: 20070301 Name: Klassenkamerad 10 Punktzahl: 95
Studenten-ID: 20070312 Name: Klassenkamerad 21 Punktzahl: 96
Studenten-ID: 20070317 Name: Klassenkamerad 26 Punktzahl: 97
Studenten-ID: 20070319 Name: Klassenkamerad 28 Punktzahl: 97
Studenten-ID: 20070325 Name: Klassenkamerad 34 Punktzahl: 98
Studenten-ID: 20070315 Name: Klassenkamerad 24 Punktzahl: 99
Studenten-ID: 20070328 Name: Klassenkamerad 37 Punktzahl: 99

Zusammenfassung von TreeSet:
1. Elemente können nicht wiederholt werden, und TreeSet ist in Ordnung.
2. Zwei Sortiermethoden:
(1) Passen Sie eine Komparatorklasse an, z. B. die Klasse Com implementierensComparator{ }, implementieren Sie die Methode „compare(Object o1, Object o2)“ und definieren Sie darin Vergleichsregeln.
(2) Vergleichen Sie die Elemente selbst.
Schritt: Implementieren Sie die Comparable-Schnittstelle für die dem TreeSet hinzugefügten Elemente und überschreiben Sie die CompareTo-Methode. Diese Reihenfolge ist auch die natürliche Reihenfolge der Elemente oder wird als Standardreihenfolge bezeichnet.

Der Unterschied zwischen Methode 1 und Methode 2:

Beide Methoden haben ihre eigenen Vor- und Nachteile, solange das Objekt, das die Comparable-Schnittstelle implementiert, direkt ist ein vergleichbares Objekt, aber der Quellcode muss geändert werden.

Der Vorteil der Verwendung von Comparator besteht darin, dass Sie den Quellcode nicht ändern müssen, sondern stattdessen einen Komparator implementieren müssen. Wenn ein benutzerdefiniertes Objekt verglichen werden muss, übergeben Sie einfach den Komparator und das Objekt zusammen. Die Größe kann verglichen werden, und in Comparator können Benutzer komplexe und universelle Logik selbst implementieren, sodass einige relativ einfache Objekte abgeglichen werden können, was viel wiederholte Arbeit ersparen kann.

(2) Verwenden Sie HashSet, um

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;
  }
    
}

zu implementieren

输出结果如下:
学号: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; 
  
  }
    
  
    
}

   

 输出结果为:

Studenten-ID: 20070303 Name: Klassenkamerad 12 Punktzahl: 61
Studenten-ID: 20070323 Name: Klassenkamerad 32 Punktzahl: 61
Studenten-ID: 20070317 Name: Klassenkamerad 26 Punktzahl: 62
Studenten-ID: 20070309 Name : Klassenkamerad 18 Punktzahl: 64
Studenten-ID: 20070301 Name: Klassenkamerad 10 Punktzahl: 67
Studenten-ID: 20070304 Name: Klassenkamerad 13 Punktzahl: 69
Studenten-ID: 20070322 Name: Klassenkamerad 31 Punktzahl: 69
Studenten-ID: 20070328 Name: Klassenkamerad 37 Punktzahl: 70
Studenten-ID: 20070305 Name: Klassenkamerad 14 Punktzahl: 71
Studenten-ID: 20070319 Name: Klassenkamerad 28 Punktzahl: 73
Studenten-ID: 20070321 Name: Klassenkamerad 30 Punktzahl: 74
Studenten-ID: 20070310 Name: Klassenkamerad 19 Punktzahl: 81
Studenten-ID: 20070315 Name: Klassenkamerad 24 Punktzahl: 82
Studenten-ID: 20070307 Name: Klassenkamerad 16 Punktzahl: 84
Student Nummer: 20070330 Name: Klassenkamerad 39 Punktzahl: 84
Studenten-ID: 20070312 Name: Klassenkamerad 21 Punktzahl: 85
Studenten-ID: 20070324 Name: Klassenkamerad 33 Punktzahl: 87
Studenten-ID: 20070306 Name: Klassenkamerad 15 Erfolge :88
Studenten-ID: 20070308 Name: Klassenkamerad 17 Punktzahl: 90
Studenten-ID: 20070327 Name: Klassenkamerad 36 Punktzahl: 90
Studenten-ID: 20070318 Name: Klassenkamerad 27 Punktzahl: 91
Studenten-ID: 20070316 Name: Klassenkamerad 25 Punktzahl: 92
Studenten-ID: 20070320 Name: Klassenkamerad 29 Punktzahl: 92
Studenten-ID: 20070314 Name: Klassenkamerad 23 Punktzahl: 93
Studenten-ID: 20070313 Name: Klassenkamerad 22 Punktzahl: 94
Studenten-ID: 20070302 Name: Klassenkamerad 11 Punktzahl: 95
Studenten-ID: 20070325 Name: Klassenkamerad 34 Punktzahl: 95
Studenten-ID: 20070329 Name: Klassenkamerad 38 Punktzahl: 97
Studenten-ID: 20070326 Name : Klassenkamerad 35 Punktzahl: 98
Studenten-ID: 20070311 Name: Klassenkamerad 20 Punktzahl: 99

Zusammenfassung von TreeMap:
1. TreeMap sortiert Schlüssel standardmäßig, sodass benutzerdefinierte Objekte platziert werden können. Geben Sie den Schlüssel ein und geben Sie die ganze Zahl, die die Schülernummer darstellt, in den Wert ein. Beim Sortieren nach Schlüssel können Sie eine Eigenschaft im benutzerdefinierten Objekt angeben, das sortiert werden soll.
2. Die Map-Sammlung verwendet die Methode put(), um Elemente hinzuzufügen.
3. Das Prinzip des Extrahierens einer Kartensammlung: Konvertieren Sie die Kartensammlung in eine festgelegte Sammlung. Nehmen Sie es durch den Iterator heraus. Zwei Möglichkeiten, den Kartensatz abzurufen:
(1) Set14b2ea0061b0064854e2015e9f0ccaf9: Speichern Sie alle Schlüssel in der Karte in der Set-Sammlung. Weil set Iteratoren hat. Alle Schlüssel können basierend auf der get-Methode iterativ abgerufen werden. Rufen Sie den Wert ab, der jedem Schlüssel entspricht.
(2) Setf7c0dd2036bac3679cff141deb226d10>: Speichern Sie die Zuordnungsbeziehung in der Kartensammlung in der Set-Sammlung, und der Datentyp dieser Beziehung ist: Map.Entry

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Studium aller hilfreich ist. Ich hoffe auch, dass jeder die chinesische PHP-Website unterstützt.

Weitere Fragen zum Java-Sammlungsframework und verschiedene Ideen zur Problemlösung finden Sie auf der chinesischen PHP-Website für verwandte Artikel!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn