mooc_java 集合框架下

1.判断List中课程是否存在

/**
     * 测试List的contains方法
     * @param args
     */
    public void testListContains(){
        Course course=(Course)coursesToSelect.get(0);
        System.out.println("取得课程"+course.name);
        System.out.println("备选课程中是否包含课程:"+course.name+","+coursesToSelect.contains(course));
        System.out.println("请输入课程名称:");
        String name=console.next();
        Course course2=new Course();
        course2.name=name;
        System.out.println("新加入:"+course2.name);
        System.out.println("备选课程中是否包含课程:"+course2.name+","+coursesToSelect.contains(course2));
    }
    

Course.java中重写equals

 1 public boolean equals(Object obj){
 2         if(this==obj)
 3             return true;
 4         if(obj==null)
 5             return false;
 6         if(!(obj instanceof Course))//判断是否为Course类型的对象
 7             return false;
 8         Course course=(Course) obj;
 9         if(this.name==null){
10             if(course.name==null)
11                 return true;
12             else
13                 return false;
14         }else{
15             if(this.name.equals(course.name))
16                 return true;
17             else {
18                 return false;
19             }
20
21         }
22     }

2.判断Set中课程是否存在

Set继承自Collection接口,所以也包含contains和containsAll方法

注意了这里关于使用 Set 集的 hashCode的方法,hashCode方法的工作原理是
Set.contains(E e)的时候,先调用从Object继承而来的hashCode方法,然后在调用equals()方法,连个方法都返回真的时候,才认定Set包含某个元素。jvm运行时,给每个对象分配唯一一个标志身份的标志hanshcode。众类鼻祖Object的hashCode()方法在默认情况下,判断哈希码是不是相同.即如同equals默认情况下比较的是二者是不是同一个内存快。Set集的contains方法,内部就是先调用hashCode再调用equals()方法。很多情况要结合实际对hashCode进行改写

3.获取List中课程的位置

indexOf()方法与lastIndexOf()方法实现原理:
1、遍历调用每个元素的equals()方法,如果返回true则将次元素的索引返回;
2、如果有多个相同元素,则只返回第一个元素的索引;
3、lastIndexOf()方法则从最后一个元素开始遍历;

1 if(coursesToSelect.contains(course2))
2             System.out.println("课程"+course2.name+"的索引位置为"+coursesToSelect.indexOf(course2));

4.判断Map中是否包含指定的key和value

Map映射表
一、判断是否包含某个Key值:containsKey()
二、判断是否包含某个Value值:containsValue()
1、同样是以每一个元素的value值的equals方法进行比较,所以需要重写value类的equals()方法来进行属性(某个)比较

 1 /**
 2      * 测试Map中是否包含某个Key值或某个Value值
 3      * @param args
 4      */
 5     public void testContainsKeyOrValue(){
 6         System.out.println("输入学生ID");
 7         Scanner console=new Scanner(System.in);
 8         String id=console.next();
 9         //在Map中,用containsKey方法判断是否包含某个Key值
10         System.out.println("您输入的学生ID"+id+",在映射表中是否存在"+students.containsKey(id));
11         if(students.containsKey(id))
12             System.out.println("对应的学生为 "+students.get(id).name);
13         System.out.println("请输入要查询的学生姓名");
14         String name=console.next();
15         //用containsValue方法,来判断是否包含某个Value值
16         if(students.containsValue(new Student(null, name)))
17             System.out.println("在学生映射表中确实存在"+name);
18         else
19             System.out.println("不存在此学生");
20     }

因为Map的键值对应的值是唯一的,而值所映射的键值却有可能是多个的,而Contains方法自带的比较机制是比较索引,也就是地址,所以ContainsValue方法需要改写

在Student类中重写hashCode和equals方法

5.应用Collection.Sort()对List排序

字符串的排列顺序  数字:0-9大写字母:A-Z 小写字母:a-z

 1 /**
 2  * 通过Collection.sort()方法,对Integer泛型的List进行排序
 3  * 对String泛型的List进行排序
 4  * 对其他类型的List进行排序,例如Student
 5  */
 6 public class CollectionTest {
 7     public void testSort1(){
 8         List<Integer> integerList=new ArrayList<Integer>();
 9         //插入10个100以内的不重复随机数
10         Random r=new Random();
11         Integer k;
12         for(int i=0;i<10;i++){
13             do{
14                 k=r.nextInt(100);
15             }while(integerList.contains(k));
16             integerList.add(k);
17             System.out.println("添加数"+k);
18         }
19         System.out.println("--------------排序前-----------------");
20         for(Integer i:integerList){
21             System.out.println("元素"+i);
22         }
23         Collections.sort(integerList);
24         System.out.println("--------------排序后-----------------");
25         for(Integer i:integerList){
26             System.out.println("元素"+i);
27         }
28     }
29     /*
30      * 对S提让您更泛型的List排序
31      */
32     public void testSort2(){
33         List<String> stringList=new ArrayList<String>();
34         stringList.add("microsoft");
35         stringList.add("google");
36         stringList.add("Lenovo");
37         System.out.println("--------------排序前-----------------");
38         for(String s:stringList){
39             System.out.println("元素"+s);
40         }
41         Collections.sort(stringList);
42         System.out.println("--------------排序后-----------------");
43         for(String s:stringList){
44             System.out.println("元素"+s);
45         }
46     }
47     public static void main(String[] args) {
48         CollectionTest ct=new CollectionTest();
49         ct.testSort1();
50         ct.testSort2();
51     }
52 }
 1 //作业
 2 public void showStringSort(){
 3   //1.创建完List<String>之后,往其中添加十几条随机字符串
 4   List<String> strings = new ArrayList<String>();
 5   for(int i = 0;i<10;i++){
 6   String str = "abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
 7   Random random = new Random();
 8   StringBuffer sb = new StringBuffer();
 9   //长度10以内的随机数
10   int numLength = random.nextInt(9)+1;
11   for(int k = 0;k<numLength;k++){
12     //3.每条字符串的每个字符都为随机生成的字符,字符可以重复
13     int numIndex = random.nextInt(61);
14     sb.append(str.charAt(numIndex));
15   }
16   //判断生成的字符串是否已经被包含
17   if(!strings.contains(sb.toString())){
18     strings.add(sb.toString());
19   }else{
20     i--;
21   }
22 }
23 System.out.println("------排序前-------");
24 for(String str:strings){
25   System.out.println(str);
26 }
27 Collections.sort(strings);
28 System.out.println("------排序后-------");
29 for(String str:strings){
30   System.out.println(str);
31 }
32 }

6.对学生序列排序

 1 /*
 2      * 对其他类型泛型的List排序
 3      */
 4     public void testSort3(){
 5         List<Student> studentList=new ArrayList<Student>();
 6         studentList.add(new Student(1+"","小明"));
 7         studentList.add(new Student(2+"","小红"));
 8         studentList.add(new Student(3+"","小兰"));
 9         System.out.println("--------------排序前-----------------");
10         for(Student s:studentList){
11             System.out.println("元素"+s);
12         }
13         Collections.sort(studentList);//由于Student并不是Comparable接口的实现类,所以报错
14         System.out.println("--------------排序后-----------------");
15         for(Student s:studentList){
16             System.out.println("元素"+s);
17         }
18     }

7.Comparable & Comparator

Comparable接口是可比较的,可进行自然排序,其实现类需实现compareTo()方法,该方法返回值为正数时表示大于,负数表示小于,0表示等于。
Comparator接口是比较工具接口,用于定义临时比较规则,而不是默认比较规则,其实现需实现compare()方法。
java接口框架:Collection接口、Map接口、Collections工具类、Comparable接口、Comparator接口

8.实现学生序列排序

1 public class Student implements Comparable<Student>{
2
3 @Override
4     public int compareTo(Student o) {
5         return this.id.compareTo(o.id);
6     }
 1 public void testSort3(){
 2         List<Student> studentList=new ArrayList<Student>();
 3         Random r=new Random();
 4         studentList.add(new Student(r.nextInt(1000)+"","mike"));
 5         studentList.add(new Student(r.nextInt(1000)+"","angela"));
 6         studentList.add(new Student(r.nextInt(1000)+"","lucy"));
 7         System.out.println("--------------排序前-----------------");
 8         for(Student s:studentList){
 9             System.out.println("元素"+s.id+":"+s.name);
10         }
11         Collections.sort(studentList);
12         System.out.println("--------------排序后-----------------");
13         for(Student s:studentList){
14             System.out.println("元素"+s.id+":"+s.name);
15         }
16     }
1 System.out.println("--------------按照姓名排序后-----------------");
2         Collections.sort(studentList,new StudentComparator());
3         for(Student s:studentList){
4             System.out.println("元素"+s.id+":"+s.name);
5         }
时间: 2024-11-05 02:40:14

mooc_java 集合框架下的相关文章

【Java集合源代码剖析】Java集合框架

转载轻注明出处:http://blog.csdn.net/ns_code/article/details/35564663 Java集合工具包位于Java.util包下,包括了非常多经常使用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习Java集合框架下大致能够分为例如以下五个部分:List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Collections). Java集合类的总体框架例如以下: 从上图中能够看出,集合类主要分

转:【Java集合源码剖析】Java集合框架

转载轻注明出处:http://blog.csdn.net/ns_code/article/details/35564663   Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习Java集合框架下大致可以分为如下五个部分:List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Collections). Java集合类的整体框架如下: 从上图中可以看出,集合类主要分为两大类:

Java集合框架图

大家在学习Java时,集合框架下有很多类,空闲时,我整理了一下,画了下面的2个图.黄色的代表接口,绿色的是抽象类,蓝色的具体类.下述所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(), next(), remove()三种方法.它的一个子接口LinkedIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious().也就是说如果是先Iterator接口,那么在遍历集合中元素的时候,只能往后遍

java常见的集合框架有哪些?

java常见的集合框架有哪些?很多学习java的朋友会问到这个问题,那么学习Java集合框架下大致可以分为如下五个部分:List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Collections).今天西安java培训小编为大家分享. Java集合类的整体框架如下: 从上图中可以看出,集合类主要分为两大类:Collection和Map. Collection是List.Set等集合高度抽象出来的接口,它包含了这些集合的基本操作,它主要又

JAVA 笔记(三) 从源码深入浅出集合框架

集合框架概述 以Java来说,我们日常所做的编写代码的工作,其实基本上往往就是在和对象打交道. 但显然有一个情况是,一个应用程序里往往不会仅仅只包含数量固定且生命周期都是已知的对象. 所以,就需要通过一些方式来对对象进行持有,那么通常是通过怎么样的方式来持有对象呢? 通过数组是最简单的一种方式,但其缺陷在于:数组的尺寸是固定的,即数组在初始化时就必须被定义长度,且无法改变. 也就说,通过数组来持有对象虽然能解决对象生命周期的问题,但仍然没有解决对象数量未知的问题. 这也是集合框架出现的核心原因,

牛刀小试 - 浅析Java集合框架的使用

基本概述 Java中的集合框架与数组类似,都是用于存储多个同一类型数据的容器. 但是对于数组的使用,会因为数组本身的特性会导致一些使用限制,例如: 数组要求在构造时,就必须确定数组的长度.所以如果想要存放的数据个数不确定,数组就无法使用. 于是促使了集合框架的诞生,与数组相比,集合框架最大特点在于: 集合框架下的容器类只能存放对象类型数据:而数组支持对基本类型数据的存放. 任何集合框架下的容器类,其长度都是可变的.所以不必担心其长度的指定问题. 集合框架下的不同容器了底层采用了不同的数据结构实现

黑马程序员--oc基础第十篇(foundation框架下、集合)

十 . oc基础(Foundation框架下) 1.下面介绍几种OC对象类型的存储结构:NSArray,NSDictionary,NSSet,以及基本数据类型封装类. NSNumber:*既然这几种数据结构都是用来存放对象类型的那么基本数据类型想要放入其中就要先对他们进行封装.使用NSNumber对基本数据类型进行封装. // // Created by keeganlee on 15/3/2. // Copyright (c) 2015年 keeganlee. All rights reser

浅入深出之Java集合框架(下)

Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. 温馨提醒:建议从(上)开始看哦~ 目 录 浅入深出之Java集合框架(上) 浅入深出之Java集合框架(中)   浅入深出之Java集合框架(下) 前 言 在<浅入深出之Java集合框架(中) >中介绍了Map接口的基本操作.使用的示例是在<浅入深出之Java集合框架(上)>中的模拟学

《深入理解Java集合框架》系列文章

Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framework, JCF)的资料却很少,甚至很难找到一本专门介绍它的书籍,这给Java学习者们带来不小的麻烦.我深深的不解其中的原因.虽然JCF设计参考了STL,但其定位不是Java版的STL,而是要实现一个精简紧凑的容器框架,对STL的介绍自然不能替代对JCF的介绍. 本系列文章主要从数据结构和算法层面分析