进行Java排序的时候碰到java.lang.IllegalArgumentException的错误,查阅资料发现是在自定义排序方法时忘记比较两者相等的情况抛出的异常,实现的compare逻辑不够严谨,如第五点的40行所示。顺便记录下排序的一系列方法。
1、普通升序
Collections.sort(要排序的内容);
@Test
public void test() {
List<String> numberList = new ArrayList<>();
numberList.add("3456");
numberList.add("1234");
numberList.add("2345");
numberList.add("5678");
numberList.add("4567");
System.out.println("排序前:"+numberList.toString());
Collections.sort(numberList);
System.out.println("排序后:"+numberList.toString());
}
输出结果
排序前:[3456, 1234, 2345, 5678, 4567]
排序后:[1234, 2345, 3456, 4567, 5678]
2、反序排序(非降序)
Collections.sort(要排序的内容);
@Test
public void test() {
List<String> numberList = new ArrayList<>();
numberList.add("3456");
numberList.add("1234");
numberList.add("2345");
numberList.add("5678");
numberList.add("4567");
System.out.println("排序前:"+numberList.toString());
Collections.reverse(numberList);
System.out.println("排序后:"+numberList.toString());
}
输出结果
排序前:[3456, 1234, 2345, 5678, 4567]
排序后:[4567, 5678, 2345, 1234, 3456]
3、中文排序
Collections.sort(要排序的内容, Collator.getInstance(java.util.Locale.CHINA));
@Test
public void test() {
List<String> numberList = new ArrayList<>();
numberList.add("上海");
numberList.add("广东");
numberList.add("浙江");
numberList.add("重庆");
numberList.add("北京");
System.out.println("排序前:"+numberList.toString());
Collections.sort(numberList, Collator.getInstance(java.util.Locale.CHINA));
System.out.println("排序后:"+numberList.toString());
}
输出结果
排序前:[上海, 广东, 浙江, 重庆, 北京]
排序后:[北京, 广东, 上海, 浙江, 重庆]
此处需要注意,虽然是按拼音排序,但是遇到多音字是无法识别的(重庆的重字)。
4、实体类排序(中文)
@Test
public void test() {
PlaceInfo info = new PlaceInfo();
List<PlaceInfo> placeList = new ArrayList<>();
//ID:2345,Number:1,Place:广东
info.setPalceName("广东");
info.setNumber(1);
info.setId("2345");
placeList.add(info);
info = new PlaceInfo();
//ID:3456,Number:3,Place:上海
info.setPalceName("上海");
info.setNumber(3);
info.setId("3456");
placeList.add(info);
info = new PlaceInfo();
//ID:1234,Number:2,Place:广东
info.setPalceName("北京");
info.setNumber(2);
info.setId("1234");
placeList.add(info);
System.out.println("排序前:"+placeList.toString());
//按照中文排序
Collections.sort(placeList, new Comparator<PlaceInfo>(){
@Override
public int compare(PlaceInfo st1, PlaceInfo st2){
Comparator<Object> com = Collator.getInstance(java.util.Locale.CHINA);
return com.compare(st1.getPalceName(), st2.getPalceName());
}
});
System.out.println("排序后:"+placeList.toString());
}
输出结果
排序前:[PlaceInfo{number=1, id='2345', palceName='广东'}, PlaceInfo{number=3, id='3456', palceName='上海'}, PlaceInfo{number=2, id='1234', palceName='北京'}]
排序后:[PlaceInfo{number=2, id='1234', palceName='北京'}, PlaceInfo{number=1, id='2345', palceName='广东'}, PlaceInfo{number=3, id='3456', palceName='上海'}]
5、实体类排序(指定规则)
@Test
public void test() {
PlaceInfo info = new PlaceInfo();
List<PlaceInfo> placeList = new ArrayList<>();
//ID:2345,Number:1,Place:北京
info.setPalceName("广东");
info.setNumber(1);
info.setId("2345");
placeList.add(info);
info = new PlaceInfo();
//ID:3456,Number:3,Place:上海
info.setPalceName("上海");
info.setNumber(3);
info.setId("3456");
placeList.add(info);
info = new PlaceInfo();
//ID:1234,Number:2,Place:广东
info.setPalceName("北京");
info.setNumber(2);
info.setId("1234");
placeList.add(info);
System.out.println("排序前:"+placeList.toString());
//指定广东、北京、上海的顺序进行排序(返回负数代表前者小,排在前面,反之亦然)
Collections.sort(placeList, new Comparator<PlaceInfo>(){
@Override
public int compare(PlaceInfo st1, PlaceInfo st2){
//判断是否为空
if(StringUtils.isBlank(st1.getPalceName())){
return 0;
}
if(StringUtils.isBlank(st2.getPalceName())){
return 1;
}
//如果两个相等返回0
//不加此条件可能会抛异常java.lang.IllegalArgumentException
if(st1.getPalceName().equals(st2.getPalceName())){
return 0;
}
if("广东".equals(st1.getPalceName())){
return -1;
}else if("广东".equals(st2.getPalceName())){
return 1;
}
if("北京".equals(st1.getPalceName())){
return -1;
}else if("北京".equals(st2.getPalceName())){
return 1;
}
if("上海".equals(st1.getPalceName())){
return -1;
}else if("上海".equals(st2.getPalceName())){
return 1;
}
//都不符合
return 0;
}
});
System.out.println("排序后:"+placeList.toString());
}
输出结果
排序前:[PlaceInfo{number=1, id='2345', palceName='广东'}, PlaceInfo{number=3, id='3456', palceName='上海'}, PlaceInfo{number=2, id='1234', palceName='北京'}]
排序前:[PlaceInfo{number=2, id='1234', palceName='北京'}, PlaceInfo{number=1, id='2345', palceName='广东'}, PlaceInfo{number=3, id='3456', palceName='上海'}]
实体类及导包情况
导包
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
PlaceInfo实体类
public class PlaceInfo {
private int number;
private String id;
private String palceName;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPalceName() {
return palceName;
}
public void setPalceName(String palceName) {
this.palceName = palceName;
}
@Override
public String toString() {
return "PlaceInfo{" +
"number=" + number +
", id='" + id + '\'' +
", palceName='" + palceName + '\'' +
'}';
}
}
以上内容为个人学习及工作笔记,代码均已运行通过,仅供学习参考。如有错误,敬请指正。