IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 集合类—List、Map、Set的简单用法 -> 正文阅读

[数据结构与算法]集合类—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());
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-07 13:58:02  更:2022-02-07 13:58:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:42:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码