繁体   English   中英

在 Java 中使用自定义比较器基于因子进行排序

[英]Sort based on Factors using Custom Comparator in Java

尝试使用自定义比较器函数根据因子数量对数组进行排序,但输出与输入相同。 排序不起作用

    public void solve(){
        Integer[] A = new Integer[]{3,9,4,6,12,10,7}; 

        System.out.println(Arrays.toString(A));
        Arrays.sort(A, (A1, B) -> {
            int fact_a = calcFactors(A1);
            int fact_b = calcFactors(B);
            if(fact_a < fact_b) return 1;
            if(fact_a==fact_b){
                if(A1 < B) return 1;
            }
            return 0;
        });
        System.out.println(Arrays.toString(A));
    }

    public int calcFactors(int A){
        int count = 0;
        int sqrt = (int)Math.sqrt(A);
        for(int i =1;i<=sqrt;i++){
            if(A%i == 0) count+=2;
        }
        if(sqrt*sqrt == A) count--;
        return count;
    }

看起来您的比较器仅检查a < b的情况。 正确实现的比较器不仅需要在a > b时返回1 ,在a == b时返回0 ,在a < b时返回-1

您可以扩展您的if逻辑以涵盖这些情况,但幸运的是,有一种更简单的方法 - Integer.compare()

int result = Integer.compare(fact_a, fact_b);
if (result == 0) {
  result = Integer.compare(A1, B);
}
return result;

Integer.compare()为您处理大部分逻辑; 您唯一需要做的就是检查因子比较的结果是否“相等”,如果是,则应用数字本身的后备比较

(注意:为了这个答案,我假设calcFactors已正确实施......)

如果A1打算在排序顺序中位于B之前,则您的比较器应返回 -1,如果A1打算在B之后,则返回 1。 仅当A1B在排序方面相等时才应返回0 但是在很多A1打算在B之后出现的情况下,您已经返回0

我认为您希望您的逻辑是这样的。

if(fact_a < fact_b){
     return -1;
}
else if(fact_a == fact_b){
    if(A1 < B) {
       return -1;
    }
    else if(A1 == B) {
       return 0;
    }
    else {
       return 1;
    }
}
else {
    return 1;
}

在 Kevin K 的回答中可以找到一种更简单的写法,我刚刚对此表示赞同。 但这向您展示了逻辑需要是什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM