Java 双动零点比较器&x27;在后面
您好,我正在寻找建立一个双精度比较器,我可以将零移到列表的后面 范例Java 双动零点比较器&x27;在后面,java,Java,您好,我正在寻找建立一个双精度比较器,我可以将零移到列表的后面 范例 5,2,3,8,0,1 我希望它看起来像这样 1,2,3,5,8,0 我的比较方法 private Double[] values; @Override public int compare(int slot1, int slot2) { final Double val1 = values[slot1]; final Double val2 = values[slot2]; if (val1 &
5,2,3,8,0,1
我希望它看起来像这样
1,2,3,5,8,0
我的比较方法
private Double[] values;
@Override
public int compare(int slot1, int slot2) {
final Double val1 = values[slot1];
final Double val2 = values[slot2];
if (val1 < val2) return -1;
if (val1 > val2) return 1;
return 0;
}
私有双[]值;
@凌驾
公共整数比较(整数slot1,整数slot2){
最终双值1=值[slot1];
最终双值2=值[slot2];
if(val1val2)返回1;
返回0;
}
如何将零移到后面?最终整数[]搜索列表=新整数[]{5,2,3,8,0,1};
final Integer[] searchList = new Integer[] { 5, 2, 3, 8, 0, 1 };
Arrays.sort(searchList, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 == 0) {
return 1;
}
if (o2 == 0) {
return -1;
}
return o1.compareTo(o2);
}
});
sort(searchList,newcomparator(){
@凌驾
公共整数比较(整数o1,整数o2){
如果(o1==0){
返回1;
}
如果(o2==0){
返回-1;
}
返回o1。与(o2)相比;
}
});
输入:5,2,3,8,0,1
结果将是:
1,2,3,5,8,0
你甚至可以这样做
简单地说
Double arry[] = {0.0,5.0,2.0,3.0,8.0,0.0,0.0,0.0,1.1,1.0};
Arrays.sort(arry, new Comparator<Double>() {
public int compare(Double s1, Double s2) {
if(s1==0.0)
return 1;
else if(s2==0.0)
return -1;
else if(s1 == 0.0 && s2 == 0.0)
return 0;
else
return s1.compareTo(s2);
}
});
System.out.println(Arrays.toString(arry));
Double arry[]={0.0,5.0,2.0,3.0,8.0,0.0,0.0,0.0,1.1,1.0};
sort(arry,新的Comparator(){
公共整数比较(双s1,双s2){
如果(s1==0.0)
返回1;
否则如果(s2==0.0)
返回-1;
否则如果(s1==0.0&&s2==0.0)
返回0;
其他的
返回s1.compareTo(s2);
}
});
System.out.println(Arrays.toString(arry));
还是这个
//first normal sorting
Double arry[] = {0.0,5.0,2.0,3.0,8.0,0.0,0.0,1.0};
Arrays.sort(arry, new Comparator<Double>() {
public int compare(Double s1, Double s2) {
if(s1<s2)
return -1;
else if(s1>s2)
return 1;
else
return 0;
}
});
// push the zeros at the end of the array
int count = 0;
int n =arry.length;
for (int i = 0; i < n; i++)
if (arry[i] != 0)
arry[count++] = arry[i];
while (count < n)
arry[count++] = 0.0;
System.out.println(Arrays.toString(arry));
//第一次正常排序
双arry[]={0.0,5.0,2.0,3.0,8.0,0.0,0.0,1.0};
sort(arry,新的Comparator(){
公共整数比较(双s1,双s2){
如果(s1s2)
返回1;
其他的
返回0;
}
});
//按数组末尾的零
整数计数=0;
int n=阵列长度;
对于(int i=0;i
将0与0进行比较应为0。将0与任何内容进行比较应大于0。将任何内容与0进行比较都应小于0。您应该能够自己将这些简单的规则转换为代码。对不起,我没有完全理解您的意思。您希望0在后面。所以你的比较器应该认为0大于1,2,3,等等。大于除0以外的任何其他双精度。当a
大于b
时,比较a
和b
的比较器必须返回正整数。当a
小于b
时,比较器必须返回一个负整数。如果双精度值为0.001,您将怎么办?我正在设置价格排序,有时人们会将价格保留为零。所以我想有可能是0.01。如果发生这种情况,我应该期待看到什么?可能不稳定。如果o1==o2==0
,理想情况下应该返回零。非常感谢,快速提问,使用o1>o2与使用compareTo相比,一般更快吗?铂金的担忧是否会引发真正的问题?它是偶然发生的。你的比较器不尊重比较器的契约,这会导致各种意想不到的结果。为什么不把它修好呢?这是一件小事,而不是希望它在公然违反规则的情况下仍能正常工作?@CodeJunkie:你真的应该自己去弄清楚。这很琐碎。当两个值相等时,比较器应该返回什么?如何测试两个整数是否等于0?@JB nize我不明白你现在在说什么。谢谢if(Objects.equals(o1,o2))返回0;如果(o1==0)返回1;如果(o2==0)返回-1;返回o1。与(o2)相比;你的表扬帮了我很多忙,已经找了好几个小时了!!谢谢。