java

java——List列表结构的复杂排序

Nick · 5月26日 · 2020年 · 本文5173字 · 阅读13分钟19,209

1. 整型(Integer)和字符串(String)类型的简单排序

这种列表数据的类型是List<Intger>和List<String>,是简单的数据类型。
可以使用以下的方法排序。

代码如下

package cn.qkongtao;/*
 *Created by tao on 2020-05-25.
 */

import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class ListSortDemo3 {

    public static void main(String[] args) {
        //对list升序排序
        List<String> list = new ArrayList();
        list.add("路飞");
        list.add("索隆");
        list.add("香吉士");
        list.add("乔巴");
        list.add("娜美");

        System.out.println("========原始数据=======");
        for (String s : list) {
            System.out.println(s);
        }
        //升序
        //是根据的汉字的拼音的字母排序的,而不是根据汉字一般的排序方法
        Collections.sort(list, Collator.getInstance(java.util.Locale.CHINA));
        System.out.println("========升序排列=======");
        for (String s : list) {
            System.out.println(s);
        }
        //降序(要想实现根据的汉字的拼音的字母排序,应该先按上面升序,然后按下面降序)
        Collections.reverse(list);
        System.out.println("========降序排列=======");
        for (String s : list) {
            System.out.println(s);
        }
    }
}

排序结果如下

java——List列表结构的复杂排序-左眼会陪右眼哭の博客
可以看出是按照中文首字母的全拼进行排序的

2. 根据list中的对象Bean中的某个属性进行排序

当List泛型的类型不是Integer和String,而是自定义的JavaBean时,这是属于一种复杂的结构,当我们要根据JavaBean中的某个字段进行排序时,可以使用以下的两种方法:

java8的新特性Lambda语法

代码如下

  1. Info.java(封装类)
package cn.qkongtao.domain;/*
 *Created by tao on 2020-05-25.
 */

public class Info {
    private String name;
    private Integer age;

    public Info() {
        super();
    }

    public Info(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }

    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;
    }

    @Override
    public String toString() {
        return "TestA [name=" + name + ", age=" + age + "]";
    }
}
  1. ListSortDemo1.java测试类
package cn.qkongtao;/*
 *Created by tao on 2020-05-25.
 */

import cn.qkongtao.domain.Info;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

public class ListSortDemo1 {
    public static void main(String[] args) {
        List<Info> users = new ArrayList<Info>();
        Info user01 = new Info("张三", 18);
        Info user02 = new Info("李四", 12);
        Info user03 = new Info("王五", 26);
        Info user04 = new Info("赵六", 50);
        Info user05 = new Info("钱七", 37);
        /*Info user01 = new Info("zhangsan", 3);
        Info user02 = new Info("lisi", 1);
        Info user03 = new Info("wangwu", 2);
        Info user04 = new Info("zaoliu", 4);
        Info user05 = new Info("qianqi", 0);
        Info user06 = new Info("sunba", 9);*/    
        users.add(user01);
        users.add(user02);
        users.add(user03);
        users.add(user04);
        users.add(user05);

        //java8遍历
        users.forEach(p -> System.out.println(p.getAge()));

        System.out.println("===排序前如下===");
        users.stream().forEach(item -> System.out.println(item));

        //根据年龄升序排序方式一
        users.sort((a, b) -> a.getAge().compareTo(b.getAge()));
        System.out.println("===根据年龄升序排序后如下方式一===");
        users.stream().forEach(item -> System.out.println(item));

        //根据年龄倒序排序方式一
        users.sort((a, b) -> b.getAge().compareTo(a.getAge()));
        System.out.println("===根据年龄降序排序后如下方式一===");
        users.stream().forEach(item -> System.out.println(item));


        //根据姓名升序排序(方式二简写)
        users.sort(Comparator.comparing(Info::getName));
        System.out.println("===根据姓名升序排序后如下方式二===");
        users.stream().forEach(item -> System.out.println(item));

        //根据姓名降序排序(方式二简写)
        users.sort(Comparator.comparing(Info::getName).reversed());
        System.out.println("===根据姓名降序排序后如下方式二===");
        users.stream().forEach(item -> System.out.println(item));


        //根据其中的某个对象的某个属性的值删除某个对象
        /*System.out.print("删除前:");
        users.stream().forEach(item -> System.out.print(item));

        Iterator<Info> it = users.iterator();
        while (it.hasNext()) {
            Info s = it.next();
            if (s.getName().equals("李四")) {
                it.remove();
            }
        }

        System.out.print("\n删除后:");
        users.stream().forEach(item -> System.out.print(item));*/
    }
}

测试结果如下

java——List列表结构的复杂排序-左眼会陪右眼哭の博客
结果表明:如果按照整型的属性来进行排序,结果时可行的,但是按照字符串(汉字)的属性来进行排序,似乎没有按照首字的全拼来排序,而是有另外的排序规则(我也不清楚)。如果是非汉字的字符串,就会根据字母进行排序。

JavaBean实现Comparable接口

实现接口的方法是,将排序的Collator替换成中文工具类
Collator collator = Collator.getInstance(java.util.Locale.CHINA);

代码如下

  1. Info.java(实现接口的JavaBean)
package cn.qkongtao.domain;/*
 *Created by tao on 2020-05-25.
 */

import java.text.Collator;
import java.util.Comparator;

public class Info implements Comparator<Info> {
    private String name;
    private Integer age;


    public Info(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }

    public Info() {

    }

    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;
    }


    @Override
    public String toString() {
        return "TestA [name=" + name + ", age=" + age + "]";
    }

    Collator collator = Collator.getInstance(java.util.Locale.CHINA);
    //重写compare方法
    @Override
    public int compare(Info o1, Info o2) {
        return collator.compare(o1.getName(), o2.getName());
    }
}
  1. ListSortDemo4,java(测试方法)
package cn.qkongtao;/*
 *Created by tao on 2020-05-26.
 */

import cn.qkongtao.domain.Info;

import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ListSortDemo4 {
    public static void main(String[] args) {
        List<Info> users = new ArrayList<Info>();
        Info user01 = new Info("张三", 18);
        Info user02 = new Info("李四", 12);
        Info user03 = new Info("王五", 26);
        Info user04 = new Info("赵六", 50);
        Info user05 = new Info("钱七", 37);
        Info user06 = new Info("乔巴", 37);
        users.add(user01);
        users.add(user02);
        users.add(user03);
        users.add(user04);
        users.add(user05);
        users.add(user06);
        System.out.println("========原始数据=======");
        for (Info user : users) {
            System.out.println(user);
        }

        System.out.println("========升序=======");
        Collections.sort(users, new Info());
        for (Info user : users) {
            System.out.println(user);
        }

        System.out.println("========降序=======");
        Collections.reverse(users);
        for (Info user : users) {
            System.out.println(user);
        }

    }
}

测试结果

java——List列表结构的复杂排序-左眼会陪右眼哭の博客
最后一种方法而可以实现JavaBean复杂类型的List按某个字段首字的中文全拼进行排序。

0 条回应
在线人数:1人
隐藏