欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一道Java集合框架題 多種解題思路

 更新時(shí)間:2016年10月28日 10:15:06   作者:溫柔狠角色  
這篇文章主要介紹了一道Java集合框架題,多種解題思路,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

問題:某班30個(gè)學(xué)生的學(xué)號(hào)為20070301-20070330,全部選修了Java程序設(shè)計(jì)課程,給出所有同學(xué)的成績(jī)(可用隨機(jī)數(shù)產(chǎn)生,范圍60-100),請(qǐng)編寫程序?qū)⒈景喔魑煌瑢W(xué)的成績(jī)按照從低到高排序打印輸出。

要求:分別用List、Map、Set來實(shí)現(xiàn),打印的信息包括學(xué)號(hào)、姓名和成績(jī)。

1、使用List集合來實(shí)現(xiàn)

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實(shí)現(xiàn) 
     * 
     * 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), "同學(xué)"+j)); 
    } 
     
    //ArrayList排序借助Collections中的sort()方法實(shí)現(xiàn)。 
    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), "同學(xué)"+j)); 
    } 
     
    //對(duì)鏈表排序 
    Collections.sort(lt, new Sortbygrade()); 
    //輸出鏈表 
    for(Student sd:lt) 
      System.out.println(sd); 
     
  } 
   
} 
 
 
 
//學(xué)生類 
class Student{ 
  int num,grade; 
  String name; 
   
  //構(gòu)造函數(shù) 
  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 "學(xué)號(hào):"+this.num+"\t"+"姓名:"+this.name+"  "+"成績(jī):"+this.grade; 
  } 
   
} 
 
//創(chuàng)建一個(gè)比較器類 
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;     
     
  } 
   
} 

 輸出結(jié)果如圖:

對(duì)List集合框架的總結(jié):

1、List集合其實(shí)是一個(gè)動(dòng)態(tài)的數(shù)組,元素可以直接通過for循環(huán)取出,而不需要迭代。
2、輸出List集合時(shí),會(huì)默認(rèn)調(diào)用集合中存儲(chǔ)對(duì)象的toString()方法,所以在類中需要進(jìn)行覆寫。
若不覆寫toString( )方法,則必須使用

for(int i=0;i<lt.size();i++) 
{ 
  Student s=lt.get(i); 
  System.out.println("學(xué)號(hào):"+s.num+"  姓名:"+s.name+"  成績(jī):"+s.grade); 
} 

3、List集合的排序需要借助于Collections工具類,即Collections.Sort(list,new 比較器類())方法。所以需要自定義一個(gè)比較器類,定義自己的比較規(guī)則。

2、使用Set集合來實(shí)現(xiàn)
(1)使用TreeSet來實(shí)現(xiàn)

package com.package1; 
 
import java.util.*; 
 
public class StuScore { 
 
public static void main(String[] args) { 
 
  TreeSet<Student> ts=new TreeSet<Student>(new Com()); 
  //添加元素進(jìn)去 
  for(int i=20070301,j=1;i<=20070330;i++,j++) 
  { 
    ts.add(new Student(i,"同學(xué)"+j,(int) (40*Math.random()+60))); 
  } 
 
  //迭代循環(huán)取出 
  Iterator<Student> it=ts.iterator(); 
  while(it.hasNext()) 
  { 
    Student o1=it.next(); 
    System.out.println("學(xué)號(hào):"+o1.num+" "+"姓名:"+o1.name+" "+" "+"成績(jī):"+o1.grade); 
 
  } 
 
} 
} 
//學(xué)生類 
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; 
} 
} 

輸出結(jié)果為:

學(xué)號(hào):20070307  姓名:同學(xué)16    成績(jī):60
學(xué)號(hào):20070309  姓名:同學(xué)18    成績(jī):60
學(xué)號(hào):20070314  姓名:同學(xué)23    成績(jī):61
學(xué)號(hào):20070318  姓名:同學(xué)27    成績(jī):61
學(xué)號(hào):20070322  姓名:同學(xué)31    成績(jī):61
學(xué)號(hào):20070306  姓名:同學(xué)15    成績(jī):62
學(xué)號(hào):20070310  姓名:同學(xué)19    成績(jī):64
學(xué)號(hào):20070302  姓名:同學(xué)11    成績(jī):66
學(xué)號(hào):20070308  姓名:同學(xué)17    成績(jī):68
學(xué)號(hào):20070321  姓名:同學(xué)30    成績(jī):68
學(xué)號(hào):20070330  姓名:同學(xué)39    成績(jī):69
學(xué)號(hào):20070303  姓名:同學(xué)12    成績(jī):70
學(xué)號(hào):20070320  姓名:同學(xué)29    成績(jī):70
學(xué)號(hào):20070323  姓名:同學(xué)32    成績(jī):77
學(xué)號(hào):20070313  姓名:同學(xué)22    成績(jī):78
學(xué)號(hào):20070304  姓名:同學(xué)13    成績(jī):79
學(xué)號(hào):20070324  姓名:同學(xué)33    成績(jī):83
學(xué)號(hào):20070326  姓名:同學(xué)35    成績(jī):84
學(xué)號(hào):20070327  姓名:同學(xué)36    成績(jī):85
學(xué)號(hào):20070311  姓名:同學(xué)20    成績(jī):88
學(xué)號(hào):20070305  姓名:同學(xué)14    成績(jī):89
學(xué)號(hào):20070329  姓名:同學(xué)38    成績(jī):89
學(xué)號(hào):20070316  姓名:同學(xué)25    成績(jī):90
學(xué)號(hào):20070301  姓名:同學(xué)10    成績(jī):95
學(xué)號(hào):20070312  姓名:同學(xué)21    成績(jī):96
學(xué)號(hào):20070317  姓名:同學(xué)26    成績(jī):97
學(xué)號(hào):20070319  姓名:同學(xué)28    成績(jī):97
學(xué)號(hào):20070325  姓名:同學(xué)34    成績(jī):98
學(xué)號(hào):20070315  姓名:同學(xué)24    成績(jī):99
學(xué)號(hào):20070328  姓名:同學(xué)37    成績(jī):99

對(duì)TreeSet的總結(jié):
1、元素不可以重復(fù),而且TreeSet是有序的。
2、兩種排序方法:
(1)自定義一個(gè)比較器類,比如class Com implementsComparator{ }  ,實(shí)現(xiàn)compare(Object o1, Object o2)方法,在其中定義比較規(guī)則。
(2)讓元素自身具備比較性。
步驟:將add進(jìn)TreeSet中的元素實(shí)現(xiàn)Comparable接口,并且覆蓋compareTo方法。這種順序也是元素的自然順序,或者叫做默認(rèn)順序。

方法1和方法2的區(qū)別:

兩種方法各有優(yōu)劣, 用Comparable 簡(jiǎn)單, 只要實(shí)現(xiàn)Comparable 接口的對(duì)象直接就成為一個(gè)可以比較的對(duì)象,但是需要修改源代碼。

用Comparator 的好處是不需要修改源代碼, 而是另外實(shí)現(xiàn)一個(gè)比較器, 當(dāng)某個(gè)自定義的對(duì)象需要作比較的時(shí)候,把比較器和對(duì)象一起傳遞過去就可以比大小了, 并且在Comparator 里面用戶可以自己實(shí)現(xiàn)復(fù)雜的可以通用的邏輯,使其可以匹配一些比較簡(jiǎn)單的對(duì)象,那樣就可以節(jié)省很多重復(fù)勞動(dòng)了。

(2)使用HashSet來實(shí)現(xiàn)

package com.package1; 
 
import java.util.*; 
 
 
 
 
public class StuScore { 
 
  public static void main(String[] args) { 
     
    HashSet<Student> hs=new HashSet<Student>(); 
    //添加元素進(jìn)去 
    for(int i=20070301,j=1;i<=20070330;i++,j++) 
    { 
     
      hs.add(new Student(i,"同學(xué)"+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); 
     
 
  } 
 
} 
//學(xué)生類 
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 "學(xué)號(hào):"+this.num+"\t"+"姓名:"+this.name 
 
+"  "+"成績(jī):"+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; 
  } 
   
} 

輸出結(jié)果如下:
學(xué)號(hào):20070310 姓名:同學(xué)19    成績(jī):60
學(xué)號(hào):20070330 姓名:同學(xué)39    成績(jī):62
學(xué)號(hào):20070326 姓名:同學(xué)35    成績(jī):63
學(xué)號(hào):20070317 姓名:同學(xué)26    成績(jī):64
學(xué)號(hào):20070318 姓名:同學(xué)27    成績(jī):65
學(xué)號(hào):20070322 姓名:同學(xué)31    成績(jī):65
學(xué)號(hào):20070301 姓名:同學(xué)10    成績(jī):67
學(xué)號(hào):20070328 姓名:同學(xué)37    成績(jī):68
學(xué)號(hào):20070304 姓名:同學(xué)13    成績(jī):68
學(xué)號(hào):20070319 姓名:同學(xué)28    成績(jī):69
學(xué)號(hào):20070313 姓名:同學(xué)22    成績(jī):70
學(xué)號(hào):20070303 姓名:同學(xué)12    成績(jī):71
學(xué)號(hào):20070312 姓名:同學(xué)21    成績(jī):71
學(xué)號(hào):20070329 姓名:同學(xué)38    成績(jī):72
學(xué)號(hào):20070306 姓名:同學(xué)15    成績(jī):72
學(xué)號(hào):20070324 姓名:同學(xué)33    成績(jī):72
學(xué)號(hào):20070305 姓名:同學(xué)14    成績(jī):75
學(xué)號(hào):20070315 姓名:同學(xué)24    成績(jī):75
學(xué)號(hào):20070314 姓名:同學(xué)23    成績(jī):78
學(xué)號(hào):20070307 姓名:同學(xué)16    成績(jī):80
學(xué)號(hào):20070311 姓名:同學(xué)20    成績(jī):81
學(xué)號(hào):20070302 姓名:同學(xué)11    成績(jī):83
學(xué)號(hào):20070309 姓名:同學(xué)18    成績(jī):84
學(xué)號(hào):20070320 姓名:同學(xué)29    成績(jī):85
學(xué)號(hào):20070321 姓名:同學(xué)30    成績(jī):85
學(xué)號(hào):20070316 姓名:同學(xué)25    成績(jī):86
學(xué)號(hào):20070327 姓名:同學(xué)36    成績(jī):90
學(xué)號(hào):20070308 姓名:同學(xué)17    成績(jī):94
學(xué)號(hào):20070323 姓名:同學(xué)32    成績(jī):94
學(xué)號(hào):20070325 姓名:同學(xué)34    成績(jī):95

對(duì)HashSet的總結(jié):
1、HashSet中的元素不可以重復(fù),如果重復(fù)添加,則只會(huì)顯示一個(gè)。
原理如下:
HashSet:底層數(shù)據(jù)結(jié)構(gòu)是哈希表。是線程不安全的。不同步。
2、HashSet是如何保證元素唯一性的呢?
答:是通過元素的兩個(gè)方法,hashCode和equals來完成。
如果元素的HashCode值相同,才會(huì)判斷equals是否為true。如果元素的hashcode值不同,不會(huì)調(diào)用equals。
3、對(duì)HashSet的排序,通過將Set集合轉(zhuǎn)化為L(zhǎng)ist集合,借助Collections.Sort( )方法實(shí)現(xiàn)排序。

3、使用TreeMap來實(shí)現(xiàn)

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.創(chuàng)建集合 
    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、往集合對(duì)象中添加元素 
       tm.put(new Student(grade,"同學(xué)"+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("學(xué)號(hào):"+num+"  "+"姓名:"+key.name+"  "+"成績(jī):"+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)  
      { //當(dāng)成績(jī)相同時(shí),按照姓名排序 
       return this.name.compareTo(o.name);  
      }  
      return -1;  
 
  } 
   
 
   
} 

 輸出結(jié)果為:

學(xué)號(hào):20070303    姓名:同學(xué)12    成績(jī):61
學(xué)號(hào):20070323    姓名:同學(xué)32    成績(jī):61
學(xué)號(hào):20070317    姓名:同學(xué)26    成績(jī):62
學(xué)號(hào):20070309    姓名:同學(xué)18    成績(jī):64
學(xué)號(hào):20070301    姓名:同學(xué)10    成績(jī):67
學(xué)號(hào):20070304    姓名:同學(xué)13    成績(jī):69
學(xué)號(hào):20070322    姓名:同學(xué)31    成績(jī):69
學(xué)號(hào):20070328    姓名:同學(xué)37    成績(jī):70
學(xué)號(hào):20070305    姓名:同學(xué)14    成績(jī):71
學(xué)號(hào):20070319    姓名:同學(xué)28    成績(jī):73
學(xué)號(hào):20070321    姓名:同學(xué)30    成績(jī):74
學(xué)號(hào):20070310    姓名:同學(xué)19    成績(jī):81
學(xué)號(hào):20070315    姓名:同學(xué)24    成績(jī):82
學(xué)號(hào):20070307    姓名:同學(xué)16    成績(jī):84
學(xué)號(hào):20070330    姓名:同學(xué)39    成績(jī):84
學(xué)號(hào):20070312    姓名:同學(xué)21    成績(jī):85
學(xué)號(hào):20070324    姓名:同學(xué)33    成績(jī):87
學(xué)號(hào):20070306    姓名:同學(xué)15    成績(jī):88
學(xué)號(hào):20070308    姓名:同學(xué)17    成績(jī):90
學(xué)號(hào):20070327    姓名:同學(xué)36    成績(jī):90
學(xué)號(hào):20070318    姓名:同學(xué)27    成績(jī):91
學(xué)號(hào):20070316    姓名:同學(xué)25    成績(jī):92
學(xué)號(hào):20070320    姓名:同學(xué)29    成績(jī):92
學(xué)號(hào):20070314    姓名:同學(xué)23    成績(jī):93
學(xué)號(hào):20070313    姓名:同學(xué)22    成績(jī):94
學(xué)號(hào):20070302    姓名:同學(xué)11    成績(jī):95
學(xué)號(hào):20070325    姓名:同學(xué)34    成績(jī):95
學(xué)號(hào):20070329    姓名:同學(xué)38    成績(jī):97
學(xué)號(hào):20070326    姓名:同學(xué)35    成績(jī):98
學(xué)號(hào):20070311    姓名:同學(xué)20    成績(jī):99

對(duì)TreeMap的總結(jié):
1、TreeMap默認(rèn)對(duì)key進(jìn)行排序,所以可將自定義對(duì)象放入key中,將代表學(xué)號(hào)的整型放入value中。對(duì)Key排序時(shí),可以指定自定義對(duì)象中的某個(gè)屬性來排序。
2、Map集合使用put()方法添加元素。
3、Map集合的取出原理:將map集合轉(zhuǎn)成set集合。在通過迭代器取出。map集合的兩種取出方式:
(1)Set<k> keySet:將map中所有的鍵存入到Set集合。因?yàn)閟et具備迭代器。所有可以迭代方式取出所有的鍵,在根據(jù)get方法。獲取每一個(gè)鍵對(duì)應(yīng)的值。
(2)Set<Map.Entry<k,v>> entrySet:將map集合中的映射關(guān)系存入到了set集合中,而這個(gè)關(guān)系的數(shù)據(jù)類型就是:Map.Entry

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例

    Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例

    本篇文章主要介紹了Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • SpringBoot+SpringCache實(shí)現(xiàn)兩級(jí)緩存(Redis+Caffeine)

    SpringBoot+SpringCache實(shí)現(xiàn)兩級(jí)緩存(Redis+Caffeine)

    這篇文章主要介紹了SpringBoot+SpringCache實(shí)現(xiàn)兩級(jí)緩存(Redis+Caffeine),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java 動(dòng)態(tài)模擬操作系統(tǒng)進(jìn)程調(diào)度算法

    Java 動(dòng)態(tài)模擬操作系統(tǒng)進(jìn)程調(diào)度算法

    這篇文章主要介紹了采用java語言編程模擬N個(gè)進(jìn)程采用動(dòng)態(tài)高優(yōu)先權(quán)優(yōu)先進(jìn)程調(diào)度算法。文中代碼具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2021-12-12
  • Java中的Rocketmq事務(wù)消息詳解

    Java中的Rocketmq事務(wù)消息詳解

    這篇文章主要介紹了Java中的Rocketmq事務(wù)消息詳解,RocketMQ的事務(wù)消息支持在業(yè)務(wù)邏輯與發(fā)送消息之間提供事務(wù)保證,RocketMQ通過兩階段的方式提供事務(wù)消息的支持,需要的朋友可以參考下
    2023-08-08
  • SpringBoot Devtools實(shí)現(xiàn)項(xiàng)目熱部署的方法示例

    SpringBoot Devtools實(shí)現(xiàn)項(xiàng)目熱部署的方法示例

    這篇文章主要介紹了SpringBoot Devtools實(shí)現(xiàn)項(xiàng)目熱部署的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • mybatis注解之@Mapper和@MapperScan的使用

    mybatis注解之@Mapper和@MapperScan的使用

    這篇文章主要介紹了mybatis注解之@Mapper和@MapperScan的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot整合JWT的入門指南

    SpringBoot整合JWT的入門指南

    JWT全稱是json web token,它將用戶信息加密到 token 里,服務(wù)器不保存任何用戶信息,服務(wù)器通過使用保存的密鑰驗(yàn)證 token 的正確性,只要正確即通過驗(yàn)證,這篇文章主要給大家介紹了關(guān)于SpringBoot整合JWT的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • gateway和jwt網(wǎng)關(guān)認(rèn)證實(shí)現(xiàn)過程解析

    gateway和jwt網(wǎng)關(guān)認(rèn)證實(shí)現(xiàn)過程解析

    這篇文章主要介紹了gateway和jwt網(wǎng)關(guān)認(rèn)證實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 搞懂Java線程池

    搞懂Java線程池

    這篇文章主要介紹了Java線程池,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java實(shí)戰(zhàn)之火車票預(yù)訂系統(tǒng)的實(shí)現(xiàn)

    Java實(shí)戰(zhàn)之火車票預(yù)訂系統(tǒng)的實(shí)現(xiàn)

    這篇文章主要介紹了利用Java實(shí)現(xiàn)的火車票預(yù)訂系統(tǒng),文中用到了JSP?、Servlert、JQuery、Ajax?等技術(shù),文中示例代碼講解詳細(xì),需要的可以參考一下
    2022-02-02

最新評(píng)論