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)相比;你的表扬帮了我很多忙,已经找了好几个小时了!!谢谢。