首页 Java java教程 一道Java集合框架题 多种解题思路

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

Jan 23, 2017 pm 04:57 PM

问题:某班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); 
      
  } 
    
} 
  
  
  
//学生类 
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集合框架题 多种解题思路

对List集合框架的总结:

1、List集合其实是一个动态的数组,元素可以直接通过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,new 比较器类())方法。所以需要自定义一个比较器类,定义自己的比较规则。

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;
}
}
登录后复制

输出结果为:

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

对TreeSet的总结:
1、元素不可以重复,而且TreeSet是有序的。
2、两种排序方法:
(1)自定义一个比较器类,比如class Com implementsComparator{ } ,实现compare(Object o1, Object o2)方法,在其中定义比较规则。
(2)让元素自身具备比较性。
步骤:将add进TreeSet中的元素实现Comparable接口,并且覆盖compareTo方法。这种顺序也是元素的自然顺序,或者叫做默认顺序。

方法1和方法2的区别:

两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。

用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在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; 
  
  }
    
  
    
}
登录后复制

   

 输出结果为:

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

对TreeMap的总结:
1、TreeMap默认对key进行排序,所以可将自定义对象放入key中,将代表学号的整型放入value中。对Key排序时,可以指定自定义对象中的某个属性来排序。
2、Map集合使用put()方法添加元素。
3、Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。map集合的两种取出方式:
(1)Set keySet:将map中所有的键存入到Set集合。因为set具备迭代器。所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。
(2)Set> entrySet:将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。

更多一道Java集合框架题 多种解题思路相关文章请关注PHP中文网!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何优雅地获取实体类变量名构建数据库查询条件? 如何优雅地获取实体类变量名构建数据库查询条件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

公司安全软件导致应用无法运行?如何排查和解决? 公司安全软件导致应用无法运行?如何排查和解决? Apr 19, 2025 pm 04:51 PM

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

如何使用MapStruct简化系统对接中的字段映射问题? 如何使用MapStruct简化系统对接中的字段映射问题? Apr 19, 2025 pm 06:21 PM

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本启动Spring...

Java对象如何安全地转换为数组? Java对象如何安全地转换为数组? Apr 19, 2025 pm 11:33 PM

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

Java程序在ARM和x86架构CPU上内存泄漏差异为何? Java程序在ARM和x86架构CPU上内存泄漏差异为何? Apr 19, 2025 pm 11:18 PM

Java程序在不同架构CPU上的内存泄漏现象分析本文将探讨一个Java程序在ARM和x86架构CPU上表现出不同内存行为的案�...

如何利用Redis缓存方案高效实现产品排行榜列表的需求? 如何利用Redis缓存方案高效实现产品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis缓存方案如何实现产品排行榜列表的需求?在开发过程中,我们常常需要处理排行榜的需求,例如展示一个�...

如何将名字转换为数字以实现群组内排序? 如何将名字转换为数字以实现群组内排序? Apr 19, 2025 pm 01:57 PM

如何将名字转为数字以实现群组内排序?在群组中排序用户时,常常需要将用户的名字转化为数字,以便在不同...

See all articles