目录
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
集合类用来存储元素,集合类中若用到基本数据类型,必须使用包装类。JDK中的集合类只能存储类的对象,基本数据类型无法直接存入集合类中,使用包装类如List
List接口(线性表接口):
ArrayList:动态数组,要保存的元素个数不确定,动态变化
LinkedList:链表
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);
总:
若不是要遍历具体的每个值,而是想打印集合中的内容,直接调用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+" ");
}
分析:杨辉三角特点
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;
}
}
a.一次存储一个不重复元素:方便进行元素去重处理
b.Set接口,元素的添加顺序和插入顺序没有太大关系(HashSet类)
c.Set是List接口的子接口,只是元素插入有了不重复的限制,其他用法和List差不多【看见Set和Map天然就是一个查找或者搜索的语义】
//插入整形
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);
ps:如果做题时需要添加的元素不是重复元素,或者换句话说,对第一次出现的元素做出特殊处理,就可以利用Set集合的add方法的返回值来巧妙处理。
eg:
//添加字符串
String[] str={"佩奇","花羊羊","图图"};
Set set=new HashSet<>();
for (String s :str) {
set.add(s);
}
System.out.println(set);
结果:
分析:不能保证插入顺序和添加元素顺序一致(元素的添加顺序和插入顺序没有太大关系)
原因(本质):使用HashSet时,一定要注意,元素的插入顺序与实际存储顺序无关,本质是因为hash的值不一定有序。
扩展:如果一定要得到插入顺序等于添加顺序(插入顺序与存储数据相同),要使用LinkedHashSet<>();
做题用到的最多的一个集合,没有之一,前面的List和Set都是一次存储一个元素,而Map接口是一个映射关系,一次存储两个元素 key==value的关系(键值对元素:key不重复,value可能会重复,一个key一定对应一个value,拿着key找value)。Map中,要求key不重复,Value可以重复。
eg:学校中,学号和姓名就是key,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
1)v value=map.get(key)
根据key取出映射的value,若key不存在,返回null。
2)V value=map.getOrDefault(key,defaultValue)
根据key取出映射的Value,若key不存在,返回默认值。
1)判断当前Map中是否包含指定key:boolean containsKey(key)
2)判断当前Map中是否包含指定Value:boolean containsValue(value)
System.out.println(map.containsKey(3));
System.out.println(map.containsValue("小美"));
1)map.remove(key):删除整个键值对,返回删除前的key对应的value,不存在返回null
map.remove(1);
System.out.println(map);
若想依次取出Map中一个个键值对进行遍历,需要将Map集合转为Set集合后进行遍历
eg:
//Map->Set
Set> entry= map.entrySet();
//for-each遍历
for (Map.Entrytemp:entry) {
System.out.println(temp.getKey()+"="+temp.getValue());
}