对list集合进行分组排序的问题

时间:2021-08-10 15:10:47
如何多     国家    省    城市  进行分组排序?

现在有一个对象   里面有三个属性,  国家,省,城市  
这个对象在一个list集合里面,
如何对 list集合进行分组排序,


list输出的  格式 :
国家1:
        省1:
                城市11:
        省2:
                城市21
                城市22:
        省3:
                城市3:
-------------------------
国家2:
        省1:
                城市11:
        省2:
                城市21
                城市22:
        省3:
                城市3:
-------------------------
国家3:
        省1:
                城市11:
        省2:
                城市21
                城市22:
        省3:
                城市3:

9 个解决方案

#1


按照你的说法是一个对象里有一个国家,多个省,多个市。你可以先安字母顺序只排国家,再对每个对象里的省排序,再对每个对象里的市排序。或者你建立三个类国家,省,市,包含关系,这样排序清晰一点。

#2


现在数据库已经设计好了,不能变了。从数据库里面查询的数据,  不可以通过查到数据的list 进行分组排序吗?

#3


    Collections类里面有一个排序的方法可以用,你需要根据你的规则定义一个类实现Comparator接口并重写一下compare方法。
    public static <T> void sort(List<T> list, Comparator<? super T> c) {
        list.sort(c);
    }




#4


lz的问题描述不是很清晰,我只能有点点拙见:可以考虑下数据出库的时候就进行分组存储到实体类(可新建一个对应需要的结构),用的时候直接用

#5


public class Address implements Comparable<Address>{
    private Integer country;
    private Integer province;
    private Integer city;

    public Integer getCountry() {
        return country;
    }

    public void setCountry(Integer country) {
        this.country = country;
    }

    public Integer getProvince() {
        return province;
    }

    public void setProvince(Integer province) {
        this.province = province;
    }

    public Integer getCity() {
        return city;
    }

    public void setCity(Integer city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return "Address [country=" + country + ", province=" + province + ", city=" + city + "]";
    }

    @Override
    public int compareTo(Address o) {
       if (o != null) {
            if (country < o.country) {                                   
                return -1;
            }else if(country == o.country){
                if(province < o.province){
                    return -1;
                }else if (province == o.province) {
                    if(city <= o.city){
                        return -1;
                    }else{
                       return 1;
                    }
                }else{
                   return 1;
                }
            }else {
                return 1;
            }
        } else {
            return -1;
        }
    }

}


public class Test {
    public static void main(String[] args) {
        List<Address> list = new ArrayList<>();
        Address address1 = new Address();
        address1.setCountry(1);
        address1.setProvince(2);
        address1.setCity(3);
        Address address2 = new Address();
        address2.setCountry(2);
        address2.setProvince(1);
        address2.setCity(2);
        Address address3 = new Address();
        address3.setCountry(3);
        address3.setProvince(3);
        address3.setCity(1);
        Address address4 = new Address();
        address4.setCountry(1);
        address4.setProvince(3);
        address4.setCity(3);
        Address address5 = new Address();
        address5.setCountry(1);
        address5.setProvince(3);
        address5.setCity(1);
        
        list.add(address2);
        list.add(address1);
        list.add(address3);
        list.add(address4);
        list.add(address5);
        
        System.out.println("排序前====================================");
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
        Collections.sort(list);
        System.out.println("排序后====================================");
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
    }

}


对list对象先按国家排序,再按省排序,最后城市排序。

输出结果:
排序前====================================
Address [country=2, province=1, city=2]
Address [country=1, province=2, city=3]
Address [country=3, province=3, city=1]
Address [country=1, province=3, city=3]
Address [country=1, province=3, city=1]
排序后====================================
Address [country=1, province=2, city=3]
Address [country=1, province=3, city=1]
Address [country=1, province=3, city=3]
Address [country=2, province=1, city=2]
Address [country=3, province=3, city=1]

#6


感谢大家帮助,这几天忙工作的事情,   已经解决了
分享一下思路,先查出所有的州(剔除重复的),然后在把州和国家的关系进行对应,   国家放在一个list 集合里面,州名为key, 把他们两个放在  HASHMAP里面,

然后在遍历从数据库里面查出来的list, 通过 州和国家名,把他下面的省输出。
我后面贴代码把、感谢大家。

#7


直接实现comparble接口,arrays.sort就搞定

#8


想办法数据库查询出来就是顺序正确的好不好。

#9


我第一反应是想到oracle的递归

#1


按照你的说法是一个对象里有一个国家,多个省,多个市。你可以先安字母顺序只排国家,再对每个对象里的省排序,再对每个对象里的市排序。或者你建立三个类国家,省,市,包含关系,这样排序清晰一点。

#2


现在数据库已经设计好了,不能变了。从数据库里面查询的数据,  不可以通过查到数据的list 进行分组排序吗?

#3


    Collections类里面有一个排序的方法可以用,你需要根据你的规则定义一个类实现Comparator接口并重写一下compare方法。
    public static <T> void sort(List<T> list, Comparator<? super T> c) {
        list.sort(c);
    }




#4


lz的问题描述不是很清晰,我只能有点点拙见:可以考虑下数据出库的时候就进行分组存储到实体类(可新建一个对应需要的结构),用的时候直接用

#5


public class Address implements Comparable<Address>{
    private Integer country;
    private Integer province;
    private Integer city;

    public Integer getCountry() {
        return country;
    }

    public void setCountry(Integer country) {
        this.country = country;
    }

    public Integer getProvince() {
        return province;
    }

    public void setProvince(Integer province) {
        this.province = province;
    }

    public Integer getCity() {
        return city;
    }

    public void setCity(Integer city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return "Address [country=" + country + ", province=" + province + ", city=" + city + "]";
    }

    @Override
    public int compareTo(Address o) {
       if (o != null) {
            if (country < o.country) {                                   
                return -1;
            }else if(country == o.country){
                if(province < o.province){
                    return -1;
                }else if (province == o.province) {
                    if(city <= o.city){
                        return -1;
                    }else{
                       return 1;
                    }
                }else{
                   return 1;
                }
            }else {
                return 1;
            }
        } else {
            return -1;
        }
    }

}


public class Test {
    public static void main(String[] args) {
        List<Address> list = new ArrayList<>();
        Address address1 = new Address();
        address1.setCountry(1);
        address1.setProvince(2);
        address1.setCity(3);
        Address address2 = new Address();
        address2.setCountry(2);
        address2.setProvince(1);
        address2.setCity(2);
        Address address3 = new Address();
        address3.setCountry(3);
        address3.setProvince(3);
        address3.setCity(1);
        Address address4 = new Address();
        address4.setCountry(1);
        address4.setProvince(3);
        address4.setCity(3);
        Address address5 = new Address();
        address5.setCountry(1);
        address5.setProvince(3);
        address5.setCity(1);
        
        list.add(address2);
        list.add(address1);
        list.add(address3);
        list.add(address4);
        list.add(address5);
        
        System.out.println("排序前====================================");
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
        Collections.sort(list);
        System.out.println("排序后====================================");
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
    }

}


对list对象先按国家排序,再按省排序,最后城市排序。

输出结果:
排序前====================================
Address [country=2, province=1, city=2]
Address [country=1, province=2, city=3]
Address [country=3, province=3, city=1]
Address [country=1, province=3, city=3]
Address [country=1, province=3, city=1]
排序后====================================
Address [country=1, province=2, city=3]
Address [country=1, province=3, city=1]
Address [country=1, province=3, city=3]
Address [country=2, province=1, city=2]
Address [country=3, province=3, city=1]

#6


感谢大家帮助,这几天忙工作的事情,   已经解决了
分享一下思路,先查出所有的州(剔除重复的),然后在把州和国家的关系进行对应,   国家放在一个list 集合里面,州名为key, 把他们两个放在  HASHMAP里面,

然后在遍历从数据库里面查出来的list, 通过 州和国家名,把他下面的省输出。
我后面贴代码把、感谢大家。

#7


直接实现comparble接口,arrays.sort就搞定

#8


想办法数据库查询出来就是顺序正确的好不好。

#9


我第一反应是想到oracle的递归