複数の問題解決アイデアを含む Java コレクション フレームワークの質問

高洛峰
リリース: 2017-01-23 16:57:17
オリジナル
1667 人が閲覧しました

質問: クラスには学生番号 20070301 ~ 20070330 の学生が 30 人います。全員が Java プログラミング コースを受講しました (60 ~ 100 の範囲の乱数を生成できます)。このクラスのすべての生徒のスコアを次の項目に割り当てるプログラム。スコアは低いものから高いものの順に印刷されます。

要件: それぞれ、リスト、マップ、およびセットを使用して実装します。印刷される情報には、学生番号、名前、成績が含まれます。

1. リストコレクションを使用して

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;     
      
  } 
    
}
ログイン後にコピー

を実装します。出力結果は次の図のようになります。

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

リストコレクションフレームワークの概要:

1. リストコレクションは実際には動的配列であり、要素を取得できます。 for ループを介して直接出力します。反復は必要ありません。
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、新しいコンパレータ クラス) の助けが必要です。 ()) 方法。したがって、コンパレータ クラスをカスタマイズし、独自の比較ルールを定義する必要があります。

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)
    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;
}
}
ログイン後にコピー

を実装する

出力結果は次のようになります:

名前: クラスメイト 16 スコア: 60
学生ID: 20070309 : クラスメイト 18 スコア: 60
学生 ID: 20070314 名前: クラスメイト 23 スコア: 61
学生 ID: 20070318 名前: クラスメイト 27 スコア: 61
学生 ID: 20070322 名前: クラスメイト 31 スコア: 61
学生 ID: 20070306 名前: クラスメイト1 5 スコア: 62
学生番号: 20070310 名前: クラスメイト 19 取得: 64
学生番号: 20070302 名前: クラスメイト 11 スコア: 66
学生番号: 20070308 名前: クラスメイト 17 取得: 68
学生番号: 20070321 名前: クラスメイト 30結果: 68
学生ID: 20070330 名前: クラスメイト39 スコア: 69
学生ID: 20070303 名前: クラスメイト12 スコア: 70
学生ID: 20070320 名前: クラスメイト29 スコア: 70
学生ID: 20070323 名前: クラスメイト32 スコア: 77
学生番号: 20070313 名前: クラスメイト 22 取得: 78
学生番号: 20070304 名前: クラスメイト 13 取得: 79
学生番号: 20070324 名前: クラスメイト 33 スコア: 83
学生番号: 20070326 名前: クラスメイト 35 スコア: 84
学籍番号:20070327 名前:クラスメイト36 スコア:85
学生ID:20070311 名前:クラスメイト20 スコア:88
学生ID:20070305 名前:クラスメイト14 スコア:89
学生ID:20070329 名前:クラスメイト38 スコア:89
学生ID :2 0070316名前:クラスメート25グレード:90研究番号:20070301名:クラスメート10 gets:95
学生番号:20070312名前:クラスメート21 Gets:96°学生番号:20070317名前:学生26スコア:学生番号:200703199名前: 名前: 名前: 20070319 名前: 名前: クラスメイト 28 学年: 97 成 8 番号: 20070325 名前: クラスメイト 34 取得: 98
学生番号: 20070315 名前: クラスメイト 24 取得: 99
学生番号: 20070328 名前: クラスメイト 37 得点: 99

TreeSet の概要:
11111:
11111: 、要素は繰り返すことができず、TreeSet は順序付けされます。

2. 2 つの並べ替え方法:

(1) ComimplementsComparator{ } などのコンパレーター クラスをカスタマイズし、compare(Object o1, Object o2) メソッドを実装し、その中で比較ルールを定義します。
(2) 要素そのものを比較対象にする。
ステップ: TreeSet に追加された要素の Comparable インターフェイスを実装し、compareTo メソッドをオーバーライドします。この順序は要素の自然な順序でもあり、デフォルト順序と呼ばれます。

方法 1 と方法 2 の違い:

どちらの方法にも独自の長所と短所があります。 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)
      return 1;
    if(s1.grade<s2.grade)
      return -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的总结:
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; 
  
  }
    
  
    
}
ログイン後にコピー

   

 输出结果为:

student ID:20070303 NAME:クラスメート12スコア:61

規模ID:20070323名前:クラスメート32スコア:61
studentID:20070317名前:クラスメート26スコア:62℃ID:20070309名前:クラスメート18スコア:64
番号番号: 20070301 名前: クラスメイト 10 スコア: 67
学生 ID: 20070304 名前: クラスメイト 13 スコア: 69
学生 ID: 20070322 名前: クラスメイト 31 スコア: 69
学生 ID: 20070328 名前: クラスメイト 37 スコア: 70
学生 ID: 70305名前: クラスメイト 14 スコア: 71
学生 ID: 20070319 名前: クラスメイト 28 スコア: 73
学生 ID: 20070321 名前: クラスメイト 30 スコア: 74
学生 ID: 20070310 名前: クラスメイト 19 スコア: 81
学生 ID: 20070315 名前:クラスメイト 24 スコア: 82
学生 ID: 20070307 名前: クラスメイト 16 スコア: 84
学生 ID: 20070330 名前: クラスメイト 39 スコア: 84
学生 ID: 20070312 名前: クラスメイト 21 スコア: 85
学生 ID: 2007032 4 名前: クラスメイト33 スコア: 87
学生 ID: 20070306 名前: クラスメイト 15 スコア: 88
学生 ID: 20070308 名前: クラスメイト 17 スコア: 90
学生 ID: 20070327 名前: クラスメイト 36 スコア: 90
学生 ID: 20070318 名前: クラスメイト 27 結果:91
学生ID: 20070316 名前: クラスメイト25 スコア: 92
学生ID: 20070320 名前: クラスメイト29 スコア: 92
学生ID: 20070314 名前: クラスメイト23 スコア: 93
学生ID: 20070313 名前: クラスメイト22 スコア:94
学生ID: 20070302 名前: クラスメイト11 スコア: 95
学生ID: 20070325 名前: クラスメイト34 スコア: 95
学生ID: 20070329 名前: クラスメイト38 スコア: 97
学生ID: 20070326 名前: クラスメイト35 スコア: 98
勉強番号: 20070311 名前: クラスメイト 20 スコア: 99

ツリーマップの概要:

1. ツリーマップはデフォルトでキーをソートするため、カスタム オブジェクトをキーに入れ、生徒番号を表す整数を値に入れることができます。キーで並べ替える場合、並べ替えるカスタム オブジェクトのプロパティを指定できます。

2. Map コレクションは put() メソッドを使用して要素を追加します。
3. マップ コレクションを抽出する原理: マップ コレクションをセット コレクションに変換します。イテレータを通して取り出します。マップ セットを取得する 2 つの方法:
(1) Set keySet: マップ内のすべてのキーを Set コレクションに保存します。 set にはイテレータがあるためです。すべてのキーは、get メソッドに基づいて繰り返し取得できます。各キーに対応する値を取得します。
(2) Set>entrySet: マップ コレクション内のマッピング関係をセット コレクションに格納します。この関係のデータ型は次のとおりです: Map.Entry

上記は全体ですこの記事の内容が皆さんの学習に役立つことを願っています。また、皆さんが PHP 中国語 Web サイトをサポートしてくれることを願っています。

Java コレクション フレームワークに関するその他の質問やさまざまな問題解決のアイデアについては、PHP 中国語 Web サイトの関連記事に注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート