现在有一个对象 里面有三个属性, 国家,省,城市
这个对象在一个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);
}
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, 通过 州和国家名,把他下面的省输出。
我后面贴代码把、感谢大家。
分享一下思路,先查出所有的州(剔除重复的),然后在把州和国家的关系进行对应, 国家放在一个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);
}
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, 通过 州和国家名,把他下面的省输出。
我后面贴代码把、感谢大家。
分享一下思路,先查出所有的州(剔除重复的),然后在把州和国家的关系进行对应, 国家放在一个list 集合里面,州名为key, 把他们两个放在 HASHMAP里面,
然后在遍历从数据库里面查出来的list, 通过 州和国家名,把他下面的省输出。
我后面贴代码把、感谢大家。
#7
直接实现comparble接口,arrays.sort就搞定
#8
想办法数据库查询出来就是顺序正确的好不好。
#9
我第一反应是想到oracle的递归