2016-12-22 7 views
1

私はASCで長い番号をソートしようとしていますが、比較が間違っているようです。正しい桁のシーケンスがありますが、7桁目からはすべてが崩れます。誰も助言することができますか?長い値を比較するとソートが間違っています

クラス:

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())); 
} 

}

これは私の番号を持つメインのテストです:

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

私は何を間違えたのでしょうか?

答えて

3

ここで独自の比較を実装する理由は何ですか?長い値と比較するための既定の方法はすでにあります。これはLong.compare()です。問題は、あなただけの取得long値から上位4つのバイトをトランクその時点で

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

でキャストが

public int compareTo(MyTime ...) { 
    return Long.compare(o1.get... 
} 
+3

ボックスに入れる必要はありません。 ['Long.compare(long、long)'](https://docs.oracle.com/javase/7/docs/api/java/lang/Long.html#compare(long、%20long))。 –

+0

私は 'Long.compareTo()'をそれに持ってこないでしょう: 'Long.compare'は正しいアプローチです。それらのボクシングは[彼らはすぐにunboxed]ので、ちょうど非効率的です(http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/Long.java# 1233)。 –

+0

あなたは正しいです。もっと理にかなっている。更新されました。 – GhostCat

3

です:だから、単純にその静的メソッドを呼び出すためにあなたの方法を変更しますランダムビットは符号インジケータである。

したがって、あなたは乱数を得ます。その他として

は、すでにあなたがより良い

Long.compare() 

を使用して、ソートを逆に持っている場合だけではなく、* -1を行うための比較の数字の位置を切り替えたいと述べました。

+1

"したがって、あなたは乱数を取得します。"私は「無作為」とは言いませんが、明らかにそうではありません。私はあなたが無意味な比較を行うことに終わると言うでしょう。 –

+0

ありがとうたくさん..それを修正し、正しく働いた – user1386966

+0

あなたは意味: "上位4バイト"。 'int'は4バイト、' long'は8バイトです。 – Andreas

関連する問題