尝试使用自定义比较器函数根据因子的数量对数组进行排序,但输出与输入保持相同。排序不工作
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。只有当A1
和B
在排序方面相等时才会返回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的回答中找到了一种更简单的写作方式,我刚刚给他点了赞。但是,这里向您展示了需要的逻辑。