对List的数据进行分组
程序员文章站
2022-05-21 16:17:18
...
对List的数据进行分组
一:我们平常在工作的时候可能会遇到要对List里面的数据进行分组在jdk1.8有方法帮我们解决,而在1.8之前我们要实现这样的功能就需要自己手动实现分组
我们先定义一个User类
public class User {
private int id;
private String contractName;
public User(int id, String contractName) {
this.id = id;
this.contractName = contractName;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getContractName() {
return contractName;
}
public void setContractName(String contractName) {
this.contractName = contractName;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", contractName='" + contractName + '\'' +
'}';
}
}
我们先实现自定义List数据分组
public static List<User> listDataSort(List<User> list){
List<User> transformList=new ArrayList<User>();
//创建一个map,来List<User>把一个分成多个List<User>
Map<Integer,List<User>> map=new HashMap<Integer,List<User>>();
//遍历传进来的list
for (User user : list) {
//如果map的某个key值已经存在同样的userId,则添加这个key所在的List<User>
if(map.containsKey(user.getId())){
map.get(user.getId()).add(user);
}
else{
//如果没有相同的id,就新创建一个List
List<User> newList=new ArrayList<User>();
//添加数据
newList.add(user);
map.put(user.getId(),newList);
}
}
/*
把Map转换成List<List<User>>,为什么会变成List<List<User>>,原因在于
map是以多个userId为键值,存储多个List<User>,map.values转换成list就会变成
List<List<User>>
*/
List<List<User>> lists=new ArrayList<List<User>>(map.values());
//遍历lists
for (List<User> users : lists) {
for (User user : users) {
//现在添加进来的User都是分好组的
transformList.add(user);
}
}
return transformList;
}
进行测试
public static void main(String[] args) {
List<User> list=new ArrayList<User>();
list.add(new User(1,"一号合同"));
list.add(new User(2,"一号合同"));
list.add(new User(1,"二号合同"));
list.add(new User(3,"一号合同"));
list.add(new User(3,"二号合同"));
list.add(new User(2,"二号合同"));
System.out.println("分组前:"+list);
System.out.println("分组后:"+listDataSort(list));
}
利用jdk1.8的新方法进行分组
public static List<User> groupList(List<User> users) {
List<User> transformList=new ArrayList<User>();
//创建一个List<List<User>>来接收工具排序后遍历出来的多个List<User>
List<List<User>> lists=new ArrayList<List<User>>();
//jdk1.8新增加的List.stream(),利用流来操作
/*
* stream()是把List转换成流
* collect()是把流转换回集合
* Collectors.groupingBy()对collect进行分组
* User::getId,根据User对象的getId进行分组
* Collectors.toList() 把每一组转换成List集合
* forEach() 进行遍历,内部自定义方法 () -> {} 这是lambada表达式,遍历出每个List<User>
* 把每个List<User>放进lists
* forEach里面的id 可以写成任何字符串,比如s aa,bb等,
* 因为我们是根据id分组的,所以写成id,usersById也可以写成任何值,
* 比如s aa,bb等,lambada是自动填充数据的
* */
users.stream().collect(Collectors.groupingBy(User::getId,Collectors.toList()))
.forEach((id,usersById) -> {
lists.add(usersById);
});
if(lists!=null){
for (List<User> list : lists) {
for (User user : list) {
transformList.add(user);
}
}
}
return transformList;
}
进行测试
public static void main(String[] args) {
List<User> list=new ArrayList<User>();
list.add(new User(1,"一号合同"));
list.add(new User(2,"一号合同"));
list.add(new User(1,"二号合同"));
list.add(new User(3,"一号合同"));
list.add(new User(3,"二号合同"));
list.add(new User(2,"二号合同"));
System.out.println("分组前:"+list);
System.out.println("分组后:"+groupList(list));
}
``
上一篇: 深度优先及广度优先算法
下一篇: 【算法设计】实验一:求解两圆相交的面积