集合类—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

JDK中java.util的集合框架jcl

集合类—List、Map、Set的简单用法_第1张图片

集合类—List、Map、Set的简单用法_第2张图片

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 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 list=new ArrayList<>();
for (int i : data) {
    list.add(i);
}
int index= list.indexOf(10);
list.remove(index);
System.out.println(list);

总:

集合类—List、Map、Set的简单用法_第3张图片

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

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

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

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

集合类—List、Map、Set的简单用法_第4张图片

 分析:杨辉三角特点

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> generate(int numRows){//返回值是List嵌套List,实际上就是一个二维数组
        //最后的二维数组
        List> ret=new ArrayList<>();
        //先写特殊的前两行--都是1
        List fir=Arrays.asList(1);
        /**Arrays.asList是一个可变参数列表
        * ()中放可变参数,里面有几个元素就放几个元素
         * 就不用new ArrayList了
        */
        ret.add(fir);//第一行加进去
        if(numRows==1){//判断是否只有一行
            return ret;//返回这个二维数组
        }
        /**
         * 第二行
         */
        List 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 prev= ret.get(i-1-1);//i-1是前一行行号,再-1是取得了前一行索引
            List 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 set=new HashSet<>();
for (int i :data) {
    set.add(i);
}
System.out.println(set);

集合类—List、Map、Set的简单用法_第5张图片

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

eg:

//添加字符串
String[] str={"佩奇","花羊羊","图图"};
Set 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 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

集合类—List、Map、Set的简单用法_第6张图片

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

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

集合类—List、Map、Set的简单用法_第7张图片

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值集合

集合类—List、Map、Set的简单用法_第8张图片

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

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

集合类—List、Map、Set的简单用法_第9张图片

 eg:

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

你可能感兴趣的:(数据结构,list,数据结构,java,map,set)