• 小鹏
    2019-07-10
    老师好,我想问一下,以后讲 Collection 的时候会提到 Comparable 和 Comparator 吗?我对比较器怎么实现排序有点晕。比如:

    //这是名为 Guy 的 Class↓
    public class Guy implements Comparable<Guy>{
        private String name;
        private int height;

        public Guy(String name, int height){
            this.name = name;
            this.height = height;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getHeight() {return height;}

        public void setHeight(int height) {
            this.height = height;
        }

        @Override
        public String toString() {
            return "Guy{" +
                    "name='" + name + '\'' +
                    ", height=" + height +
                    '}';
        }

        @Override
        //按照身高从高到矮排序
        public int compareTo(Guy o) {
            if (this.height >= o.height)
                return -1;
            else
                return 1;
        }
    }

    //这是测试 Guy 排序的 Class↓
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;

    public class TestGuy {
        public static void main(String[] args) {
            List<Guy> guys = new ArrayList<>();

            //10个170以上的人
            for (int i = 0; i < 10; i++) {
                guys.add(new Guy("Person " + i, 170 + i));
            }

            //使用 sort,按照身高从高到矮排序
            Collections.sort(guys);
            System.out.println(guys);
        }
    }

    我的问题是,怎么样判断是按照从小到大排序,还是从大到小排序?在上面的例子里,如果把 public int compareTo() 的地方改成:

    public int compareTo(Guy o) {
            if (o.height >= this.height)
                return -1;
            else
                return 1;
        }

    那么,就是按照身高从矮到高排序了,感觉不是很懂。而且修改返回值的正负也会影响排序,那么,在 public int compareTo() 里面,返回值 1 和 -1,以及 0,代表的是什么意思?

    就是这里有点疑点,希望老师能解答一下。
    展开

    作者回复: 首先必须提出表扬。代码,结果,问题都说的很清楚,而且明显是经过了思考和学习后提出的问题,是一个优质的问题。人工点赞👍


    说回问题本身。collection的sort是递增排序(asc),也就是从小到大。如果要改变循序,可以通过改变compareTo的逻辑。

    两个实例的大小,就是通过conpareTo判断的。compareTo中1代表本实例大于参数传来的实例,0代表等于,-1代表小于。

    你的实现里有个小问题,在等于的情况下应该返回0。碰巧你的例子里面没有身高相等的,所以不会发现问题。


    有问题欢迎补充。

    
     1
  • 怕什么,抱紧我
    2020-02-07
    如何设计一个好的异常呢!

    作者回复: 这个具体情况具体分析。方向性来说,
    1)能解决的不抛异常,不能解决的才抛异常
    2)接到一个异常,一样的道理,能处理就处理,不能处理继续向上抛
    3)异常要包含足够的信息以供解决问题
    4)异常的类型要清晰明确,一类异常代表一类问题

    
    
我们在线,来聊聊吧