集合类—List、Map、Set的简单用法

目录

1.集合类

JDK中java.util的集合框架jcl

2.List

1)List中的增删查改操作

2)遍历List集合与Set集合:for-each循环

3)List接口实现杨辉三角问题

3.Set接口

1)概念

2)插入:set.add

3)查找:set.contains

4)注意:set集合没有修改元素的方法

4.Map接口

1)概念

2)添加/修改:put(K key, V value)

3)查找

1.根据指定的key查找value

2.判断key或value是否存在

4)删除 

 5)Map集合的遍历:一般不去遍历

获取Map当前所有key值集合

获取Map当前所有value值集合

 若想遍历Map中键值对:转为Set


1.集合类

        集合类用来存储元素,集合类中若用到基本数据类型,必须使用包装类。JDK中的集合类只能存储类的对象,基本数据类型无法直接存入集合类中,使用包装类如List<Integer>

JDK中java.util的集合框架jcl

2.List

List接口(线性表接口):

ArrayList:动态数组,要保存的元素个数不确定,动态变化

LinkedList:链表

1)List中的增删查改操作

a.增加

1)add(任意数据类型 新值)【add方法默认在集合末尾添加

2)add(int index,任意数据类型):在索引为index的位置插入新元素

b.查找

1)get(int index):返回index位置的元素值

2)boolean contains(元素值):判断List中是否包含指定值

c.改

set(int index,新值):修改index位置元素为新元素,返回修改前的元素值

d.删除

1)remove(int index):删除指定位置元素

2)remove(元素值):按值删除,默认删除第一个元素

eg:增查改

int[] data={1,3,5,7,9,10,10,13};
List<Integer> list=new ArrayList<>();
for (int i :data) {
    list.add(i);
}
System.out.println(list.contains(10));
System.out.println(list.get(0));

 eg:删

int[] data={1,3,5,7,9,10,10,13};
List<Integer> list=new ArrayList<>();
for (int i : data) {
    list.add(i);
}
int index= list.indexOf(10);
list.remove(index);
System.out.println(list);

总:

2)遍历List集合与Set集合:for-each循环

若不是要遍历具体的每个值,而是想打印集合中的内容,直接调用println方法传入对象即可(集合类覆写了toString),如果要取出具体的某个元素:for-each遍历

int[] data={1,3,5,7,9,10,10,13};
List<Integer> list=new ArrayList<>();
for (int i : data) {
    list.add(i);
}
System.out.println(list);//打印集合中的内容
for (int temp :list) {//取出集合中的每个元素
    System.out.print(temp+" ");
}

3)List接口实现杨辉三角问题

 分析:杨辉三角特点

1)每一行元素个数和行数相同

2)每一行第一个元素和最后一个元素都是1,固定值

3)第i行第j列等于第i-1行j-1列+i-1行第j列【[i,j]=[i-1,j-1]+[i-1,j]】每一行第一个和最后一个元素都是1,此处j至少从第二列开始计算

注意:i和j表示实际行数和列数,默认都从1计数,但是索引都是从0开始计数的,因此和实际的行和列遍历时注意索引

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Num118_Yanghui {
    public List<List<Integer>> generate(int numRows){//返回值是List嵌套List,实际上就是一个二维数组
        //最后的二维数组
        List<List<Integer>> ret=new ArrayList<>();
        //先写特殊的前两行--都是1
        List<Integer> fir=Arrays.asList(1);
        /**Arrays.asList是一个可变参数列表
        * ()中放可变参数,里面有几个元素就放几个元素
         * 就不用new ArrayList了
        */
        ret.add(fir);//第一行加进去
        if(numRows==1){//判断是否只有一行
            return ret;//返回这个二维数组
        }
        /**
         * 第二行
         */
        List<Integer> sec =Arrays.asList(1,1);
        ret.add(sec);
        if(numRows==2){
            return ret;
        }
        /**
         * 此时numRows至少为三行
         * i为行数,遍历行数,<=numRows,要取到numRows行
         * j列
         * [i,j]=[i-1,j-1]+[i-1,j]
         */
        for (int i = 3; i <= numRows; i++) {
            //先取得前一行(i-1行)所有元素
            List<Integer> prev= ret.get(i-1-1);//i-1是前一行行号,再-1是取得了前一行索引
            List<Integer> cur=new ArrayList<>();//当前行
            //每一行第一列都是1
            cur.add(1);//先添加上1
            //从第二列开始到i-1列,即到倒数第二个元素
            for (int j = 2; j < i; j++) {//j从第二列开始(注意,这里的i,j不是索引,是行列数),why不取等于->因为最后一列也是1,直接在最后添加就行,不在遍历范围
                int tmpValue=prev.get(j-1-1)+prev.get(j-1);//i-1行的j-1列+i行j列(get括号中再减一是取得索引)
                cur.add(tmpValue);//循环依次添加tmpValue到第i行
            }
            //每一行最后一个元素也是1
            cur.add(1);
            ret.add(cur);//cur是行,每行循环完,把这行加到二维数组ret中
        }
        return ret;
    }
}

3.Set接口

1)概念

a.一次存储一个不重复元素:方便进行元素去重处理

b.Set接口,元素的添加顺序和插入顺序没有太大关系HashSet类

c.Set是List接口的子接口,只是元素插入有了不重复的限制,其他用法和List差不多【看见Set和Map天然就是一个查找或者搜索的语义

2)插入:set.add

//插入整形
int[] data={1,2,2,3,3,3,4,5,6,6};
Set<Integer> set=new HashSet<>();
for (int i :data) {
    set.add(i);
}
System.out.println(set);

ps:如果做题时需要添加的元素不是重复元素,或者换句话说,对第一次出现的元素做出特殊处理,就可以利用Set集合的add方法的返回值来巧妙处理

eg:

//添加字符串
String[] str={"佩奇","花羊羊","图图"};
Set<String> set=new HashSet<>();
for (String s :str) {
    set.add(s);
}
System.out.println(set);

 结果:

 分析:不能保证插入顺序和添加元素顺序一致(元素的添加顺序和插入顺序没有太大关系)

原因(本质)使用HashSet时,一定要注意,元素的插入顺序与实际存储顺序无关,本质是因为hash的值不一定有序

扩展:如果一定要得到插入顺序等于添加顺序(插入顺序与存储数据相同),要使用LinkedHashSet<>();

3)查找:set.contains

4)注意:set集合没有修改元素的方法

4.Map接口

1)概念

        做题用到的最多的一个集合,没有之一,前面的List和Set都是一次存储一个元素,而Map接口是一个映射关系,一次存储两个元素 key==value的关系(键值对元素:key不重复,value可能会重复,一个key一定对应一个value,拿着key找value)。Map中,要求key不重复,Value可以重复。

eg:学校中,学号和姓名就是key,value的关系

2)添加/修改:put(K key, V value)

将key和对应value存储到Map中,若key已经存在,则更新value值为新插入的值

当key在Map中不存在,则是添加,若key已存在,则是修改

eg:

//学号和姓名的映射关系
//学号作为key,姓名作为Value
//Map(key,value)
Map<Integer,String> map=new HashMap<>();
map.put(1,"图图");
map.put(2,"小丽");
map.put(3,"小美");
//key重复时,更新值
map.put(1,"其他");
System.out.println(map);

 结果:

 分析:key重复时,更新value

3)查找

1.根据指定的key查找value

1)v value=map.get(key)

根据key取出映射的value,若key不存在,返回null

 2)V value=map.getOrDefault(key,defaultValue)

根据key取出映射的Value,若key不存在,返回默认值

2.判断key或value是否存在

1)判断当前Map中是否包含指定key:boolean containsKey(key)

2)判断当前Map中是否包含指定Value:boolean containsValue(value)

System.out.println(map.containsKey(3));
System.out.println(map.containsValue("小美"));

4)删除 

1)map.remove(key):删除整个键值对,返回删除前的key对应的value,不存在返回null

map.remove(1);
System.out.println(map);

5)Map集合的遍历:一般不去遍历

获取Map当前所有key值集合

获取Map当前所有value值集合

 若想遍历Map中键值对:转为Set

若想依次取出Map中一个个键值对进行遍历,需要将Map集合转为Set集合后进行遍历

 eg:

//Map->Set
Set<Map.Entry<Integer,String>> entry= map.entrySet();
//for-each遍历
for (Map.Entry<Integer,String>temp:entry) {
    System.out.println(temp.getKey()+"="+temp.getValue());
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
public class Student { private String name; private int id; private Set<String> courses; public Student(String name, int id) { this.name = name; this.id = id; this.courses = new HashSet<>(); } public String getName() { return name; } public int getId() { return id; } public Set<String> getCourses() { return courses; } public void addCourse(String course) { this.courses.add(course); } } public class School { private List<Student> students; public School() { this.students = new ArrayList<>(); } public void addStudent(Student student) { this.students.add(student); } public List<Student> getStudents() { return students; } public Set<String> getAllCourses() { Set<String> courses = new HashSet<>(); for (Student student : students) { courses.addAll(student.getCourses()); } return courses; } public Map<Integer, String> getStudentMap() { Map<Integer, String> studentMap = new HashMap<>(); for (Student student : students) { studentMap.put(student.getId(), student.getName()); } return studentMap; } } public class Main { public static void main(String[] args) { Student student1 = new Student("Alice", 1); student1.addCourse("Math"); student1.addCourse("English"); Student student2 = new Student("Bob", 2); student2.addCourse("History"); School school = new School(); school.addStudent(student1); school.addStudent(student2); Set<String> courses = school.getAllCourses(); System.out.println("All courses: " + courses); Map<Integer, String> studentMap = school.getStudentMap(); System.out.println("Student map: " + studentMap); } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值