比较长值时排序错误 [英] Sorting is wrong when comparing long values

查看:36
本文介绍了比较长值时排序错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在ASC中对长数字进行排序,但似乎比较是错误的.有一个正确的数字序列,但是从第7个数字开始,它们全都弄乱了.谁能告诉我为什么?

I'm trying to sort long numbers in ASC but seems that the comparison is wrong. There is a sequence of correct digits, but from the 7th digit it all messes up. Can anyone advise why?

课程:

public class MyTime {

    private long timeInMicroSeconds;

    public MyTime (long timeInMicroSeconds) {
        this.timeInMicroSeconds = timeInMicroSeconds;
    }
}

public class tester implements Comparator<MyTime> {

      public int compare(MyTime o1, MyTime o2) {
          return (int) ( (-1) * (o2.getTimeInMicroSeconds() - o1.getTimeInMicroSeconds()));
}

}

这是我的电话号码的主要测试:

This is the main test with my numbers :

  MyTime t1 = new MyTime (1482072568710018L);
    MyTime  t2 = new MyTime (1482068966855246L);
    MyTime t3 = new MyTime (1482068967752058L);
    MyTime t4 = new MyTime (1482069164096129L);
    MyTime t5 = new MyTime (1482072704590983L);
    MyTime t6 = new MyTime (1482068963206124L);
    MyTime t7 = new MyTime (1482069164097807L);
    MyTime t8 = new MyTime (1482068962786004L);
    MyTime t9 = new MyTime (1482069034105390L);
    MyTime t10 = new MyTime (1482068979718112L);
    MyTime t11 = new MyTime (1482068963143736L);
    MyTime t12 = new MyTime (1482069164098280L);
    MyTime t13 = new MyTime (1482069029615872L);
    MyTime t14 = new MyTime (1482072704590408L);



    List<MyTime > n = new ArrayList<MyTime >();
    n.add(t1);
    n.add(t2);
    n.add(t3);
    n.add(t7);
    n.add(t11);
    n.add(t14);
    n.add(t10);
    n.add(t9);
    n.add(t6);
    n.add(t2);
    n.add(t4);
    n.add(t12);
    n.add(t13);
    n.add(t5);
    n.add(t8);



 //RUNNING THE SORT
   System.out.println("printing before : " );
    for(int i = 0 ; i < n.size() ; i ++)
    {
        System.out.println(n.get(i).getTimeInMicroSeconds());
    }

    Collections.sort(n, new tester());
    System.out.println("printing after : " );
    for(int i = 0 ; i < n.size() ; i ++)
    {
        System.out.println(n.get(i).getTimeInMicroSeconds());
    }

这是输出:

    printing before : 
1482072568710018
1482068966855246
1482068967752058
1482069164097807
1482068963143736
1482072704590408
1482068979718112
1482069034105390
1482068963206124
1482068966855246
1482069164096129
1482069164098280
1482069029615872
1482072704590983
1482068962786004


printing after : 
1482072568710018
1482072704590408
1482072704590983
1482068962786004
1482068963143736
1482068963206124
1482068966855246
1482068966855246
1482068967752058
1482068979718112
1482069029615872
1482069034105390
1482069164096129
1482069164097807
1482069164098280

您会看到: 1482072568710018<1482072704590408<1482072704590983>1482068962786004

有人告诉我我做错了什么吗?

any advise what I did wrong?

推荐答案

问题在于

 return (int) ( (-1) * // ...

这时,您只需要中继long值的高4个字节,就可以得到一个随机位作为符号指示符.

at that point you just trunk the upper 4 bytes from the long value getting a random bit being the sign indicator.

因此,您得到一个随机数.

Therefore you get a random number.

正如其他人所述,您最好使用

As the other already stated you'd better use

Long.compare()

,如果您进行了反向排序,则只需切换比较数字的位置即可,而不用进行 * -1 .

and if you have reverse the sort just switch the position of the compared numbers instead of doing * -1.

这篇关于比较长值时排序错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆