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

Un problème de cadre de collection Java avec plusieurs idées de résolution

Problème :Une classe30 est le numéro d'étudiant de20070301-20070330, tous les élèves ont suivi le cours de conception de programmes Java, donnez les notes de tous les élèves (générées par des nombres aléatoires, avec une plage60-100),Veuillez écrire un programme pour trier et imprimer les notes des élèves de la classe par ordre croissant.

Exigence :Réaliser avec List, Map, Set, et imprimer les informations, y compris le numéro d'étudiant, le nom et la note.

1、Utiliser la collection List pour réaliser

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){ 
    /* Ici, ArrayList est utilisé 
     * 
     * 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), "Étudiant"+j)); 
    } 
    //Le tri de l'ArrayList est réalisé à l'aide de la méthode sort() de 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), "Étudiant"+j)); 
    } 
    //Tri de la liste 
    Collections.sort(lt, new Sortbygrade()); 
    //Sortir la liste 
    for(Student sd:lt) 
      System.out.println(sd); 
  } 
} 
//Classe étudiant 
class Student{ 
  int num,grade; 
  String name; 
  //Constructeur 
  public Student(int num,int grade,String name){ 
    this.num=num; 
    this.name=name; 
    this.grade=grade; 
  } 
  //Il est nécessaire de redéfinir 
  public String toString(){ 
//   System.out.println("hi"); 
    return "Numéro d'étudiant :"+this.num+"\t"+"Nom :"+this.name+"  "+"成绩:"+this.grade; 
  } 
} 
//Créer une classe comparateur 
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;     
  } 
} 

 Le résultat de la sortie est représenté comme suit :

du cadre de collection ListRésumé :

1、La collection List est en fait un tableau dynamique, les éléments peuvent être extraits directement par un boucle for, sans nécessiter d'itération.
2、Lorsque vous sortez une collection List, il appelle par défaut la méthode toString()de l'objet stocké dans la collection, donc vous devez l'overrider dans la classe.
Si vous ne surchargez pas la méthode toString( ) , vous devez utiliser

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

3、Pour trier une collection List, il est nécessaire d'utiliser l'outil Collections, c'est-à-dire la méthode Collections.Sort(list, new ComparateurClasse()) . Par conséquent, il est nécessaire de définir une classe de comparateur personnalisé, définir vos propres règles de comparaison.

2、Utiliser la collection Set pour réaliser
(1) utiliser TreeSet pour réaliser

package com.package1; 
import java.util.*; 
public class StuScore { 
public static void main(String[] args) { 
   
  //Ajouter des éléments à l'intérieur 
  for(int i=20070301,j=1;i<=20070330;i++,j++) 
  { 
    ts.add(new Student(i,"Étudiant"+j,(int) (40*Math.random()+60))); 
  } 
  //Itération itérative pour extraire 
  Iterator<Student> it=ts.iterator(); 
  while(it.hasNext()) 
  { 
    Student o1=it.next(); 
    System.out.println("学号:"+o1.num+" "+"姓名:"+o1.name+" "+" "+"Résultat :"+o1.grade); 
  } 
} 
} 
//Classe étudiant 
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; 
} 
} 

Le résultat de la sortie est :

Numéro d'étudiant :20070307  Nom : Étudiant16    Résultat :60
Numéro d'étudiant :20070309  Nom : Étudiant18    Résultat :60
Numéro d'étudiant :20070314  Nom : Étudiant23    Résultat :61
Numéro d'étudiant :20070318  Nom : Étudiant27    Résultat :61
Numéro d'étudiant :20070322  Nom : Étudiant31    Résultat :61
Numéro d'étudiant :20070306  Nom : Étudiant15    Résultat :62
Numéro d'étudiant :20070310  Nom : Étudiant19    Résultat :64
Numéro d'étudiant :20070302  Nom : Étudiant11    Résultat :66
Numéro d'étudiant :20070308  Nom : Étudiant17    Résultat :68
Numéro d'étudiant :20070321  Nom : Étudiant30  Résultat :68
Numéro d'étudiant :20070330  Nom : Étudiant39    Résultat :69
Numéro d'étudiant :20070303  Nom : Étudiant12    Résultat :70
Numéro d'étudiant :20070320  Nom : Étudiant29    Résultat :70
Numéro d'étudiant :20070323  Nom : Étudiant32    Résultat :77
Numéro d'étudiant :20070313  Nom : Étudiant22    Résultat :78
Numéro d'étudiant :20070304  Nom : Étudiant13    Résultat :79
Numéro d'étudiant :20070324  Nom : Étudiant33    Résultat :83
Numéro d'étudiant :20070326  Nom : Étudiant35    Résultat :84
Numéro d'étudiant :20070327  Nom : Étudiant36    Résultat :85
Numéro d'étudiant :20070311  Nom : Étudiant20  Résultat :88
Numéro d'étudiant :20070305  Nom : Étudiant14    Résultat :89
Numéro d'étudiant :20070329  Nom : Étudiant38    Résultat :89
Numéro d'étudiant :20070316  Nom : Étudiant25    Résultat :90
Numéro d'étudiant :20070301  Nom : Étudiant10    Résultat :95
Numéro d'étudiant :20070312  Nom : Étudiant21    Résultat :96
Numéro d'étudiant :20070317  Nom : Étudiant26    Résultat :97
Numéro d'étudiant :20070319  Nom : Étudiant28    Résultat :97
Numéro d'étudiant :20070325  Nom : Étudiant34    Résultat :98
Numéro d'étudiant :20070315  Nom : Étudiant24    Résultat :99
Numéro d'étudiant :20070328  Nom : Étudiant37    Résultat :99

Contrairement àTreeSetRésumé :
1、Les éléments ne peuvent pas être répétés, et TreeSet est ordonné.
2、Deux méthodes de tri :
(1) définir une classe de comparateur personnalisé, par exemple class Com implements Comparator { } , implémenter compare(Object o1, Object o2) méthode, dans laquelle vous définissez les règles de comparaison.
(2) pour que l'élément ait la capacité de comparaison.
Étapes : implémenter l'interface Comparable pour l'élément ajouté au TreeSet et surcharger la méthode compareTo. Cet ordre est également l'ordre naturel des éléments, ou appelé ordre par défaut.

méthode1et la méthode2La différence :

Les deux méthodes ont leurs avantages et inconvénients. Utiliser Comparable est simple, il suffit d'implémenter l'interface Comparable pour que l'objet devienne directement un objet comparable, mais cela nécessite de modifier le code source.

L'avantage d'utiliser Comparator est qu'il n'est pas nécessaire de modifier le code source, mais de réaliser un comparateur supplémentaire. Lorsqu'un objet personnalisé doit être comparé, le comparateur et l'objet sont transmis ensemble pour permettre la comparaison. Dans Comparator, l'utilisateur peut réaliser des logiques complexes et générales, permettant ainsi de correspondre à certains objets simples, ce qui permet de gagner beaucoup de temps et d'efforts répétés.

(2)en utilisantHashSetpour réaliser

package com.package1; 
import java.util.*; 
public class StuScore { 
  public static void main(String[] args) { 
    HashSet<Student> hs=new HashSet<Student>(); 
    //Ajouter des éléments à l'intérieur 
    for(int i=20070301,j=1;i<=20070330;i++,j++) 
    { 
      hs.add(new Student(i,"camarade"+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); 
  } 
} 
//Classe étudiant 
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 "Numéro d'étudiant :"+this.num+"\t"+"Nom :"+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; 
  } 
} 

Le résultat de la sortie est le suivant :
Numéro d'étudiant :20070310 Nom : camarade19    Note :60
Numéro d'étudiant :20070330 Nom : camarade39    Note :62
Numéro d'étudiant :20070326 Nom : camarade35    Note :63
Numéro d'étudiant :20070317 Nom : camarade26    Note :64
Numéro d'étudiant :20070318 Nom : camarade27    Note :65
Numéro d'étudiant :20070322 Nom : camarade31    Note :65
Numéro d'étudiant :20070301 Nom : camarade10    Note :67
Numéro d'étudiant :20070328 Nom : camarade37    Note :68
Numéro d'étudiant :20070304 Nom : camarade13    Note :68
Numéro d'étudiant :20070319 Nom : camarade28    Note :69
Numéro d'étudiant :20070313 Nom : camarade22    Note :70
Numéro d'étudiant :20070303 Nom : camarade12    Note :71
Numéro d'étudiant :20070312 Nom : camarade21    Note :71
Numéro d'étudiant :20070329 Nom : camarade38    Note :72
Numéro d'étudiant :20070306 Nom : camarade15    Note :72
Numéro d'étudiant :20070324 Nom : camarade33    Note :72
Numéro d'étudiant :20070305 Nom : camarade14    Note :75
Numéro d'étudiant :20070315 Nom : camarade24    Note :75
Numéro d'étudiant :20070314 Nom : camarade23    Note :78
Numéro d'étudiant :20070307 Nom : camarade16    Note :80
Numéro d'étudiant :20070311 Nom : camarade20 Note :81
Numéro d'étudiant :20070302 Nom : camarade11    Note :83
Numéro d'étudiant :20070309 Nom : camarade18    Note :84
Numéro d'étudiant :20070320 Nom : camarade29    Note :85
Numéro d'étudiant :20070321 Nom : camarade30 Note :85
Numéro d'étudiant :20070316 Nom : camarade25    Note :86
Numéro d'étudiant :20070327 Nom : camarade36    Note :90
Numéro d'étudiant :20070308 Nom : camarade17    Note :94
Numéro d'étudiant :20070323 Nom : camarade32    Note :94
Numéro d'étudiant :20070325 Nom : camarade34    Note :95

Contrairement àHashSetRésumé :
1Les éléments de HashSet ne peuvent pas être répétés. Si vous ajoutez à nouveau, il ne sera affiché qu'un seul.
Le principe est le suivant :
HashSet : la structure de données de base est une table de hachage. Elle n'est pas sécurisée en mode multithreadé. Non synchronisée.
2Comment assure HashSet l'unicité des éléments ?
答:是通过元素的两个方法,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)  
      { //Si les notes sont égales, triez par nom 
       return this.name.compareTo(o.name);  
      }  
      return -1;  
  } 
} 

 Le résultat de la sortie est :

Numéro d'étudiant :20070303    Nom : Étudiant12    Note :61
Numéro d'étudiant :20070323    Nom : Étudiant32    Note :61
Numéro d'étudiant :20070317    Nom : Étudiant26    Note :62
Numéro d'étudiant :20070309    Nom : Étudiant18    Note :64
Numéro d'étudiant :20070301    Nom : Étudiant10    Note :67
Numéro d'étudiant :20070304    Nom : Étudiant13    Note :69
Numéro d'étudiant :20070322    Nom : Étudiant31    Note :69
Numéro d'étudiant :20070328    Nom : Étudiant37    Note :70
Numéro d'étudiant :20070305    Nom : Étudiant14    Note :71
Numéro d'étudiant :20070319    Nom : Étudiant28    Note :73
Numéro d'étudiant :20070321    Nom : Étudiant30 Note :74
Numéro d'étudiant :20070310    Nom : Étudiant19    Note :81
Numéro d'étudiant :20070315    Nom : Étudiant24    Note :82
Numéro d'étudiant :20070307    Nom : Étudiant16    Note :84
Numéro d'étudiant :20070330 Nom : Étudiant39    Note :84
Numéro d'étudiant :20070312    Nom : Étudiant21    Note :85
Numéro d'étudiant :20070324    Nom : Étudiant33    Note :87
Numéro d'étudiant :20070306    Nom : Étudiant15    Note :88
Numéro d'étudiant :20070308    Nom : Étudiant17    Note :90
Numéro d'étudiant :20070327    Nom : Étudiant36    Note :90
Numéro d'étudiant :20070318    Nom : Étudiant27    Note :91
Numéro d'étudiant :20070316    Nom : Étudiant25    Note :92
Numéro d'étudiant :20070320 Nom : Étudiant29    Note :92
Numéro d'étudiant :20070314    Nom : Étudiant23    Note :93
Numéro d'étudiant :20070313    Nom : Étudiant22    Note :94
Numéro d'étudiant :20070302    Nom : Étudiant11    Note :95
Numéro d'étudiant :20070325    Nom : Étudiant34    Note :95
Numéro d'étudiant :20070329    Nom : Étudiant38    Note :97
Numéro d'étudiant :20070326    Nom : Étudiant35    Note :98
Numéro d'étudiant :20070311    Nom : Étudiant20 Note :99

Contrairement àTreeMapRésumé :
1TreeMap trie par défaut les clés, donc vous pouvez mettre des objets personnalisés dans les clés, et mettre des entiers entiers représentant les numéros d'étudiant en valeur. Lors de la hiérarchie des clés, vous pouvez spécifier une propriété de l'objet personnalisé pour hiérarchiser.
2L'ajout d'éléments à l'ensemble Map en utilisant la méthode put ()
3Le principe d'extraction de l'ensemble Map : convertir l'ensemble Map en ensemble Set, puis extraire à l'aide de l'itérateur. Deux méthodes d'extraction de l'ensemble Map :
(1Set<k> keySet :Tous les clés du map sont stockées dans l'ensemble Set. Comme Set possède un itérateur, toutes les clés peuvent être extraites de manière itérative, puis obtenues en utilisant la méthode get pour chaque clé.
(2Set<Map.Entry<k,v>> entrySet :La relation de correspondance de l'ensemble map est stockée dans l'ensemble set, et le type de données de cette relation est : Map.Entry

Voici la fin de cet article, j'espère qu'il vous sera utile dans vos études, et j'espère que vous soutiendrez également le tutoriel Yelling.

Déclaration : le contenu de cet article est extrait du réseau, la propriété intellectuelle appartient à ses auteurs respectifs, le contenu est contribué et téléchargé par les utilisateurs d'Internet, le site Web ne possède pas de propriété, n'a pas été édité par l'homme et n'assume aucune responsabilité juridique. Si vous trouvez du contenu susceptible de violer les droits d'auteur, n'hésitez pas à envoyer un e-mail à : notice#w3Pour signaler une violation, veuillez envoyer un e-mail à codebox.com (remplacez # par @) et fournir des preuves pertinentes. Une fois confirmée, le site supprimera immédiatement le contenu suspect de violation de droit d'auteur.

Vous pourriez aussi aimer