java.lang.IllegalArgumentException报错原因 java排序


进行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 + '\'' +
                '}';
    }
}

以上内容为个人学习及工作笔记,代码均已运行通过,仅供学习参考。如有错误,敬请指正。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彷徨灬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值