准备:
目录
准备:
新增
排序
基本类型排序
引用类型排序
去重
分组
删除
- 平时开发中我们使用最多的便是ArrayList,所以就以ArrayList为例
- 在使用ArrayList的时候泛型要使用引用类型不可以使用int,shot这种基本类型
新增
- 新增时我们可以直接add,一个个的新增进去;也可以直接使用addAll方法,我们以将数组全部加入list为例。使用addAll方法;也可以在指定的位置插入我们想要的元素
ArrayList<Integer> strings = new ArrayList<>();
Integer[] arrays = {4, 3, 6, 5, 1};
//新增元素
strings.add(1);
strings.addAll(Arrays.asList(arrays));
System.out.println(strings);
//指定位置新增元素
strings.add(1, 22);
System.out.println("指定位置插入" + strings); - 输出结果
[1, 4, 3, 6, 5, 1]
指定位置插入[1, 22, 4, 3, 6, 5, 1] ?可以看到list集合中的数据是按照我们插入的顺序进行输出的,但是我们并不想要这样的顺序,我们可以将list集合按照我们自己想要的模式进行排序
排序
基本类型排序
基本类型排序非常简单,我们直接使用Java提供给我们的工具类就可以实现了
Collections.sort(strings);
System.out.println("排序后" + strings);
//-----------------------输出结果-------------------------------------
排序后[1, 1, 3, 4, 5, 6, 22]
引用类型排序
- 当然大部分时候我们的list中存放的都是引用类型,例如我们的user类等,这个时候使用工具类就不太好使了,因为他也不知道我们到底想要按照哪个属性进行排序
- 这个时候就需要我们自己去自定义了,我们可以将我们的实体类实现Comparable接口,并重写他的compareTo方法即可
package com.dataStructure;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
/**
* @ProjectName: com.dataStructure
* @author: ZhangBiBo
* @description: list集合的排序
* @data: 2022/1/13
*/
public class ListSort {
public static void main(String[] args) {
//------------------------list存一个对象排序-------------------------------------------------
User user1 = new User(1);
User user2 = new User(3);
User user3 = new User(2);
User user4 = new User(5);
User user5 = new User(4);
ArrayList<User> integers2 = new ArrayList<>();
integers2.add(user1);
integers2.add(user2);
integers2.add(user3);
integers2.add(user4);
integers2.add(user5);
System.out.println(integers2);
Collections.sort(integers2);
System.out.println(integers2);
}
}
class User implements Comparable<User>{
private Integer integer;
public Integer getInteger() {
return integer;
}
public User(Integer integer) {
this.integer = integer;
}
public void setInteger(Integer integer) {
this.integer = integer;
}
@Override
public String toString() {
return "User{" +
"integer=" + integer +
'}';
}
@Override
public int compareTo(User o) {
int i =this.integer-o.integer;
return i;
}
}
//------------------------输出结果-------------------------------------------
[User{integer=1}, User{integer=3}, User{integer=2}, User{integer=5}, User{integer=4}]
[User{integer=1}, User{integer=2}, User{integer=3}, User{integer=4}, User{integer=5}]
可以看到虽然我们的元素按照我们的想法进行了排序,但会存在重复的数据,这个时候我们可以对其进行去重操作
去重
去重的时候,有很多方式例如:借用hashSet进行去重;也可以循环遍历使用list的contains方法,找到重复的元素然后删除;
HashSet<Integer> set = new HashSet<>();
set.addAll(strings);
strings.clear();
strings.addAll(set);
System.out.println("去重后"+strings);
//----------------------输出结果----------------------
去重后[1, 3, 4, 5, 6, 22]
// 创建一个新的list集合,用于存储去重后的元素
List listTemp = new ArrayList();
// 遍历list集合
for (int i = 0; i < strings.size(); i++) {
// 判断listTemp集合中是否包含list中的元素
if (!listTemp.contains(list.get(i))) {
// 将未包含的元素添加进listTemp集合中
listTemp.add(list.get(i));
}
}
在排好序之后我们还可以对其进行分组
分组
Map<String, List<Student>> collect = stuList.stream().collect(Collectors.groupingBy(Student::getInstitution));
最后再来看一个删除操作吧
删除
- 在删除的时候需要注意:在删除某个特定元素的时候可以使用for循环,增强for,迭代器中任意一种,但需要循环删除就只能使用迭代器,其他两种不好使会报错
- 还需要注意一点,如果list中存放的时Integer类型的数据,那么在删除时需要强转,否则会导致按照你指定的数字的下标去删
Iterator<Integer> iterator = strings.iterator();
while (iterator.hasNext()) {
if (iterator.next() > 5) {
iterator.remove();
//不能使用 strings.remove(iterator); 是删不掉的
}
}
System.out.println("将大于5的全部删除" + strings);
//fori当需要循环删除的时候,例如删除两个1会存在删不干净的情况,因为下标发生了变化,当你想删下标1时已经时它已经变成了0
for (int i = 0; i < strings.size(); i++) {
if (strings.get(i).equals(1)) {
strings.remove(i);
}
}
System.out.println(strings);
//foreach 报数组下标越界
for (Integer i : strings) {
if (i.equals(3)) {
strings.remove(i);
break;
}
}
strings.remove(0);
System.out.println(strings);
strings.remove((Integer) 5);
System.out.println(strings);
|