第四周 Day5

1.集合的引入

对象数组:能够储存对象的数组;
创建数组的格式:
    数据类型[] 数组名称 = new 数据类型[长度];
数组:
    既可以存储基本类型,也可以存储引用类型;
使用数组也可以完成针对引用类型数据的存储以及遍历,但是弊端是长度固定;数组操作引用类型数据,不适合操作长度一直变化的需求,所以使用"集合";
//使用数组存储5个学生,学生有姓名和年龄,(对象数组),将数组学生信息遍历出来

2.集合和数组的区别

1)长度的区别:
    数组:长度是固定的
    集合:长度数可变的
​
2)存储数据的区别
    数组:既可以存储基本数据类型,也可以存储引用数据类型;
    集合:只能存储引用数据类型,通过"泛型";
    
3)存储元素的区别
    数组:只能存储同一种数据类型的元素
    集合:如果没有泛型的约定,它可以存储任意的引用型元素
    
    泛型:<E>  --->Element元素
        <T>  --->Type 都是引用类型
        Collection<E>  --->模仿数组,在创建集合的明确数据类型
    例:Collection<String>--->明确存储String类型的元素
    但是,后期"反射"可以直接给里面加入任意类型,不加泛型,可能导致程序不安全;

3.集合的体系结构及功能

父接口Collection<E>  :单列集合,里面只能存储一种引用类型
​
子接口:
            List                  set
         ArrayList<E>        HashSet<E>--->底层添加元素的实现--->HashMap
         LinkedList<E>       TreeSet<E>--->底层的添加元素的实现--->TreeMap
         Vector<E>
         
Collection:是所有集合的根接口,集合表示一组被称为其元素的对象。一些集合允许重复元素(List集合),而其他集合不允许重复(Set:唯一的);
JDK不提供此接口的任何直接实现:它提供了更具体的子接口的实现,如Set和List--->实现类(接口多态!)
​
Collection功能:
        添加:boolean add(E--Object(任意类型元素) e)---只要添加元素,元素数就+1,所以永远返回的true
        判断:
            boolean contains(Object o):是否包含指定的元素
            boolean equals(Object o):比较
            boolean isEmpty():判断集合是否为空
        删除:
            void clear():删除所有元素
            boolean remove(Object o):删除集合中指定的元素
        获取功能:
            int size():获取集合元素数
            Iterator<E> iterator():迭代器(重点)--增强fou循环语句代替迭代器,写法简单
            Object[] toArray():传统 方式集合转换成对象数组--->遍历

4.集合的高级功能

带All的功能:
    boolean addAll(Collection c)添加一个集合中的所有元素
    boolean containsAll(Collection c):包括一个集合中元素;注意:包含一个集合中所有元素才是包含
    boolean removeAll(Collection c):删除集合中的包含的元素;删除的元素一个只要包含,都存在,那么就删除了
    boolean retainAll(Collection c):获取两个集合中交集元素;
    A集合对B集合求交集,
              如果没有交集元素,那么A集合内容就是[](-->存储交集的元素 没有交集)
              如果有交集,交集的元素是存在A集合中,返回值是看A集合中的元素内容是否发生变化
              如果有变化--->true
              如果没有变化--->false
​

5.集合的获取功能

1.Object[] toArray():传统 方式集合转换成对象数组--->遍历

5.1代码展示

public class CollectionDemo3 {
    public static void main(String[] args) {
        //针对集合的遍历方式1:Collection里面的Object[] toArray():
        //创建一个Collection集合
        Collection c  = new ArrayList() ; //没有加入泛型的话-->里面可以存储任意的Object类型元素
​
        //创建5个学生对象
        Student s1 = new Student("刘备",45) ;
        Student s2 = new Student("曹操",50) ;
        Student s3 = new Student("关羽",35) ;
        Student s4 = new Student("张飞",30) ;
        Student s5 = new Student("周瑜",25) ;
​
        //将5个学生对象添加到Collection中
        c.add(s1) ;
        c.add(s2) ;
        c.add(s3) ;
        c.add(s4) ;
        c.add(s5) ;
        
       //将集合转换成对象数组
       //Collection里面的Object[] toArray()
        Object[] objs = c.toArray();
       //遍历
        for(int x = 0 ; x <objs.length ; x++){ 
            Student s = (Student)objs[x] ;//向下转型
            System.out.println(s.getName()+"---"+s.getAge());
        }
    }
}

5.2加入泛型

泛型:
    就是集合对象的在创建的时候,就已经明确了存储的类型的限定!
格式:
     <E> EElement---->存储的引用数据类型的元素
加入泛型的好处:
    1)提高了程序安全性,不会出现类型转换问题!
                2)避免了强转类型转换的格式
                3)将运行时期异常提前到了编时译期(编译通过不了,不能运行!)--- (使用迭代器的方式进行遍历)
public class CollectionTest {
    public static void main(String[] args) {
        //创建一个Collection集合
        //加入泛型
        Collection<Student> c = new ArrayList<>() ;//后面<默认不写,默认和前面类型一致>
​
        //创建5个学生对象
        Student s1 = new Student("刘备",45) ;
        Student s2 = new Student("曹操",50) ;
        Student s3 = new Student("关羽",35) ;
        Student s4 = new Student("张飞",30) ;
        Student s5 = new Student("周瑜",25) ;
​
        //将5个学生对象添加到Collection中
        c.add(s1) ;
        c.add(s2) ;
        c.add(s3) ;
        c.add(s4) ;
        c.add(s5) ;
​
        //将集合转换成对象数组
        Object[] objects = c.toArray() ;
        for(int i = 0 ; i < objects.length ; i ++){
            Student s = (Student) objects[i]; //强转
            System.out.println(s.getName()+"---"+s.getAge());
        }
    }
}
​

6.集合遍历---利用迭代器

//迭代器的本质是迭代器的子实现类,其中的子实现类是ArraLIst集合实现的
public class CollectionDemo {
    public static void main(String[] args) {
​
        //创建集合对象
        Collection<String> c = new ArrayList<>() ;
​
        //添加字符串元素
        c.add("hello") ;
        c.add("world") ;
        c.add("JavaEE") ;
        //获取Collection集合的迭代器
        //Iterator<E> iterator() :返回值是接口--->需要返回需要返回的就是子实现类对象
        //Iterator迭代器的泛型和创建集合的明确的类型是一种
        //将集合的元素存储在迭代器中了
        Iterator<String> it = c.iterator();
        
         while(it.hasNext()){//是否有可以遍历的元素
                //成立,不断获取
            //Integer i = it.next() ;
            String s = it.next();
            System.out.println(s+"----"+s.length());
        }
​
    }
}
​
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您的问题已经收到。以下是我的回答: 您好!根据您的要求,我可以设计如下的Python程序: ``` import datetime gan_zhi = ["甲子", "乙丑", "丙寅", "丁卯", "戊辰", "己巳", "庚午", "辛未", "壬申", "癸酉", "甲戌", "乙亥", "丙子", "丁丑", "戊寅", "己卯", "庚辰", "辛巳", "壬午", "癸未", "甲申", "乙酉", "丙戌", "丁亥", "戊子", "己丑", "庚寅", "辛卯", "壬辰", "癸巳", "甲午", "乙未", "丙申", "丁酉", "戊戌", "己亥", "庚子", "辛丑", "壬寅", "癸卯", "甲辰", "乙巳", "丙午", "丁未", "戊申", "己酉", "庚戌", "辛亥", "壬子", "癸丑", "甲寅", "乙卯", "丙辰", "丁巳", "戊午", "己未", "庚申", "辛酉", "壬戌", "癸亥"] # 判断一个年份是否是闰年 def is_leap_year(year): if year % 4 == 0 and year % 100 != 0 or year % 400 == 0: return True else: return False # 输入日期,返回该年干支纪年、该日期为该年的第几周、该日期为该年的第几天 def get_date_info(date_str): date = datetime.datetime.strptime(date_str, "%Y-%m-%d").date() year = date.year month = date.month day = date.day # 计算该年份的干支纪年 gan_index = (year - 1984) % 60 zhi_index = (year - 1984) % 12 gan_zhi_year = gan_zhi[gan_index] + gan_zhi[zhi_index] # 计算该日期为该年的第几周和第几天 first_day = datetime.datetime(year, 1, 1).date() first_day_weekday = first_day.weekday() days = (date - first_day).days if first_day_weekday == 6: days += 1 week = days // 7 + 1 day_of_week = date.weekday() + 1 return gan_zhi_year, week, day_of_week # 测试 print(get_date_info("2022-05-30")) # 输出 ('壬子丙午', 22, 1) ``` 以上程序定义了一个`get_date_info`函数,接受一个格式为`year-month-day`的日期字符串,返回一个元组,其中包含该年份的干支纪年、该日期为该年的第几周和第几天。 程序首先定义了一个`gan_zhi`列表,保存了60个干支组合,用于计算任意年份的干支纪年。 接下来是判断一个年份是否是闰年的函数`is_leap_year`,用于计算该年份是否有366天,也就是2月有29天,从而计算该年份的第几周和第几天。 最后是`get_date_info`函数,先将输入的字符串转换为`datetime.date`类型,然后计算该年份的干支纪年:先计算年份的干支纪年的下标,再计算年份所对应的生肖的下标,加起来组成该年份的干支纪年。 接下来计算该日期为该年的第几周和第几天:首先计算出该年第一天的日期和星期几,然后算出输入日期与第一天的天数差(注意如果第一天是星期天,需要让每周的第一天是星期一),最后将天数差除以7,就可以得到该日期是该年的第几周。同时,也可以通过`datetime.date`类型自带的`weekday`方法,得到该日期是星期几。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值