在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的回答中找到了一种更简单的写作方式,我刚刚给他点了赞。但是,这里向您展示了需要的逻辑。

相关内容

  • 没有找到相关文章

最新更新