List 的排序、筛选、去重、统计。

List 的三种排序方式

数据准备

准备一个List,这里有四个变量,id,name,age,birthday;因为私有变量,所以需要添加一个访问的方法

public class UserBean {
    private long id;
    private String name;
    private Integer age;
    private String birthday;
    public UserBean(long id,String name,Integer age,String birthday){
        this.id=id;
        this.name=name;
        this.age=age;
        this.birthday=birthday;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User{"+
                "name="+this.name+","+
                "id="+this.id+","+
                "age="+this.age+","+
                "birthday="+this.birthday+
                "}";

    }
}

Comparator

这里使用了其实是重写了Collections的sort中的compare方法,如果o1.attributeValue>o2.attributeValue那么返回1,表示需要调整顺序,如果<的话就是不调整,所以这样下来就是一个升序的排序,反之就是降序了,固定的模式记着就可以了

public class OrderList {
    public static List initUserBean() {
        List<UserBean> userBeanList = new ArrayList<>();
        userBeanList.add(new UserBean(1001, "alpha", 10, "2000/1/23"));
        userBeanList.add(new UserBean(1002, "beta", 30, "1990/3/23"));
        userBeanList.add(new UserBean(3003, "gamma", 23, "1993/1/12"));
        userBeanList.add(new UserBean(4001, "delta", 43, "1973/7/30"));
        userBeanList.add(new UserBean(9001, "epsilon", 9, "2001/11/28"));
        userBeanList.add(new UserBean(522, "zeta", 19, "1999/4/7"));
        for (UserBean userBean : userBeanList) {
            System.out.println(userBean.getName());
        }
        return userBeanList;
    }

    public static void sortUserByComparator(List<UserBean> users) {
        System.out.println("排序前的顺序");
        for (UserBean user : users) {
            System.out.println(user.toString());
        }
        System.out.println("排序后");
//      NOTE 使用Collections 的工具类;
        Collections.sort(users, new Comparator<UserBean>() {
            @Override
            public int compare(UserBean o1, UserBean o2) {
                if (o1.getAge() > o2.getAge()) {
                    return 1;
                } else if (o1.getAge() < o2.getAge()) {
                    return -1;
                } else {
                    return 0;
                }
            }
        });
        for (UserBean user : users) {
            System.out.println(user.toString());
        }
    }
  
    public static void main(String[] args) {
        List<UserBean> userBeans = initUserBean();
        sortUserByComparator(users);     
    }
}

stream

java 8以后加入的,使用这个更加方便,推荐

public class OrderList {
    public static List initUserBean() {
        List<UserBean> userBeanList = new ArrayList<>();
        userBeanList.add(new UserBean(1001, "alpha", 10, "2000/1/23"));
        userBeanList.add(new UserBean(1002, "beta", 30, "1990/3/23"));
        userBeanList.add(new UserBean(3003, "gamma", 23, "1993/1/12"));
        userBeanList.add(new UserBean(4001, "delta", 43, "1973/7/30"));
        userBeanList.add(new UserBean(9001, "epsilon", 9, "2001/11/28"));
        userBeanList.add(new UserBean(522, "zeta", 19, "1999/4/7"));
        for (UserBean userBean : userBeanList) {
            System.out.println(userBean.getName());
        }
        return userBeanList;
    }

  
    public static void sortUserByStream(List<UserBean> users) {
        System.out.println("排序前");
        for (UserBean user : users) {
            System.out.println(user.toString());
        }
        System.out.println("正序后");
        List<UserBean> newUsersAlpha = users.stream()
                .sorted(Comparator.comparing(UserBean -> UserBean.getAge()))
                .collect(Collectors.toList());
        System.out.println("倒序后");
        List<UserBean> newUserBeta = users.stream()
                .sorted(Comparator.comparing(UserBean::getAge).reversed())
                .collect(Collectors.toList());
        for (UserBean user : newUserBeta) {
            System.out.println(user.toString());
        }
    }



    public static void main(String[] args) {
        List<UserBean> userBeans = initUserBean();
        sortUserByStream(userBeans);
    }
}

Comparable

这里是用类调用了Comparable的接口来实现的,首先就是在类中重写了Comparable的compareTo( )的方法,
然后在调用的时候直接使用Collections.sort(object)来进行调用

类的实现如下:

public class User implements Comparable<User> {
    private long id;
    private String name;
    private Integer age;
    private String birthday;

    public User(long id, String name, Integer age, String birthday) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.birthday = birthday;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "name=" + this.name + "," +
                "id=" + this.id + "," +
                "age=" + this.age + "," +
                "birthday=" + this.birthday +
                "}";

    }

    @Override
    public int compareTo(User o) {
        if(this.age>o.getAge()){
            return 1;
        } else if (this.age<o.getAge()) {
            return -1;
        }else {
            return 0;
        }
    }
}

使用场景

public class OrderList {
    public static List intiUser() {
        /** 这里使用userBeanList 来替代本来的userList,不想改了*/
        ArrayList<User> userBeanList = new ArrayList<>();
        userBeanList.add(new User(1001, "alpha", 10, "2000/1/23"));
        userBeanList.add(new User(1002, "beta", 30, "1990/3/23"));
        userBeanList.add(new User(3003, "gamma", 23, "1993/1/12"));
        userBeanList.add(new User(4001, "delta", 43, "1973/7/30"));
        userBeanList.add(new User(9001, "epsilon", 9, "2001/11/28"));
        userBeanList.add(new User(522, "zeta", 19, "1999/4/7"));
        for (User userBean : userBeanList) {
            System.out.println(userBean.getName());
        }
        return userBeanList;
    }
    public static void sortUserByComparable(ArrayList<User> userList) {
        System.out.println("排序前");
        for (User user : userList) {
            System.out.println(user);
        }
        System.out.println("排序后");
        List<User> sortedUserList = (List<User>) userList.clone();
        Collections.sort(sortedUserList);//**这里就是直接调用就可以了,如果倒序的话需要到类中修改**
        for (User user : sortedUserList) {
            System.out.println(user);
        }
    }
    public static void main(String[] args) {
        List<User> users = intiUser();
        sortUserByComparable((ArrayList<User>) users);

    }
}

List的三种筛选方式

java8以后的stream

其实就是使用stream的filter

		List<UserBean> userBeanFilterResult = userBeanList.stream()
                .filter(UserBean -> UserBean.getAge() > 18)
                .collect(Collectors.toList());
        /** 为了防止很多对象有null的情况,那么在userBean.getAge() 会有空指针,
         * 所以在前面加一个filter处理逻辑,*/
        List<UserBean> finalUserBeanFilterResult=userBeanList.stream()
                .filter(userBean -> Objects.nonNull(userBean))
//                .filter(Objects::nonNull)
                .filter(userBean -> userBean.getAge()>18)
                .collect(Collectors.toList());
        for(UserBean ele:userBeanFilterResult){
            System.out.println(ele);
        }

最基础的for循环

for and foreach

        List<UserBean> userBeansFilterResult=new ArrayList<>();
        for (UserBean element:userBeanList){
            if(element.getAge()>18){
                userBeansFilterResult.add(element);
            }
        }
        for (UserBean ele:userBeansFilterResult){
            System.out.println(ele);
        }
        /**
         * 第二种for循环*/
        List<UserBean> userBeansFilterResultBeta=new ArrayList<>();
        userBeanList.forEach(element->{
            if(element.getAge()>18){
                userBeansFilterResultBeta.add(element);
            }
        });
        for (UserBean ele:userBeansFilterResultBeta){
            System.out.println(ele);
        }

使用迭代器

这里就是for循环更底层的一种方式

 List<UserBean> userBeansFilterResult=new ArrayList<>();
        Iterator<UserBean>iterator=userBeanList.iterator();
        while (iterator.hasNext()){
            UserBean element=iterator.next();
            if(element.getAge()>18){
                userBeansFilterResult.add(element);
            }
        }
        for (UserBean element : userBeansFilterResult) {
            System.out.println(element);
        }

List的去重

利用HashMap来进行去重

这里不知道为啥不直接用HashSet去重,其实使用HashSet 可能更方便。。。

    public static List<UserBean> handleSameElementHashMap(List<UserBean> userBeansList) {
        if (userBeansList == null || userBeansList.size() == 0) {
            return userBeansList;
        }
        List<UserBean> list = new ArrayList<>();
        Map<String, UserBean> userBeanMap = new HashMap<>();
        userBeansList.forEach(userBean -> userBeanMap.put(userBean.getName(), userBean));
        userBeanMap.forEach((s, userBean) -> list.add(userBean));
        return list;
    }
//调用
    public static void alphaUniqueUserBean(){
        /**第一种方法就是使用哈希来进行,利用hash的唯一性来进行去重
         * 这里保存的是后面的,也就是使用覆盖的类型*/
        List<UserBean>userBeanList=initUserBeanList();
        List<UserBean>uniqueUserBeanList=UniqueueList.handleSameElementHashMap(userBeanList);
        uniqueUserBeanList.forEach(System.out::println);
    }

使用HashSet来进行去重

这里不知道为啥非要加一个optional来进行,虽然是我自己写的,但是真的不知道ide为啥要给个这个提示。

    public static List<UserBean> handleSameElementByHashSet(List<UserBean>userBeanList){
        if(null==userBeanList||userBeanList.size()==0){
            return userBeanList;
        }
        Set<String> hashSet=new HashSet<>();
        userBeanList.forEach(userBean -> hashSet.add(userBean.getName()));
        System.out.println(hashSet);
//        List<UserBean> filteredUserBeanList=userBeanList.stream()
//                .filter(userBean -> hashSet.contains(userBean.getName()))
//                .collect(Collectors.toList());
//        System.out.println(filteredUserBeanList);
        List<Optional<UserBean>> filteredUserBenList=new ArrayList<>();
//        System.out.println(testUserBean);
        hashSet.forEach(element->filteredUserBenList.add(userBeanList.stream().filter(ele->ele.getName().equals(element)).findFirst()));
        System.out.println(filteredUserBenList);
        return userBeanList;
    }
    public static void deltaUniqueUserBean(){
        /**这里使用HashSet来进行处理
         * */
        List<UserBean>userBeanList=initUserBeanList();
        UniqueueList.handleSameElementByHashSet(userBeanList);
    }

利用TreeSet()来进行去重

    public static List<UserBean> handleSameElementByTreeSet(List<UserBean> userBeanList) {
        if (userBeanList.size() > 0 && userBeanList != null) {
            Set<UserBean> set = new TreeSet<>(new Comparator<UserBean>() {
                @Override
                public int compare(UserBean o1, UserBean o2) {
                    return o1.getName().compareTo(o2.getName());
                }
            });
            set.addAll(userBeanList);
            return new ArrayList<UserBean>(set);
        }
        return userBeanList;
    }
    
    public static void betaUniqueUserBean(){
        /** 第二种是使用treeSet来
         * 后面这两个都是使用保存第一个的方式*/
        List<UserBean>userBeanList=initUserBeanList();
        List<UserBean>uniqueUserBeanList=UniqueueList.handleSameElementByTreeSet(userBeanList);
        uniqueUserBeanList.forEach(System.out::println);
    }

第三种是使用stream来进行处理–有点难懂

    public static void gammaUniqueUserBean(){
        /**使用stream来进行解决*/
        List<UserBean>userBeanList=initUserBeanList();
        List<UserBean>uniqueUserBeanList=UniqueueList.handleSameElementByStream(userBeanList);
        uniqueUserBeanList.forEach(System.out::println);
    }
    public static List<UserBean> handleSameElementByStream(List<UserBean> userBeanList) {
        if (null == userBeanList || userBeanList.size() == 0) {
            return userBeanList;
        }
        List<UserBean> list = userBeanList.stream()
                .collect(Collectors.collectingAndThen(
                        Collectors.toCollection(
                                () -> new TreeSet<>(Comparator.comparing(UserBean::getName)))
                        , ArrayList::new));

        return list;
    }

对象的分组

根据对象的某一个属性对对象进行分组

    public static void listGroupedByStream(List<UserBean>userBeanList){
        Map<String,List<UserBean>> result= (Map<String, List<UserBean>>) userBeanList.stream()
                .filter(Objects::nonNull)
                .collect(Collectors.groupingBy(UserBean::getGrade));
        for(Map.Entry<String ,List<UserBean>> element:result.entrySet()){
            System.out.println(element);
        }
//        System.out.println(result);
    }
求均值
        Double aveResult;
        aveResult=userBeanList.stream().filter(Objects::nonNull)
                .mapToDouble(UserBean::getChineseScore).average()
                .orElseThrow(IllegalArgumentException::new);
        System.out.println(aveResult);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值