[英]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。 仅当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 的回答中可以找到一种更简单的写法,我刚刚对此表示赞同。 但这向您展示了逻辑需要是什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.