2012-01-29 8 views
1
String title ="A"; 
int year = 2009; 
String director = "Zebra"; 

String title1 ="B"; 
int year1 = 2010; 
String director1 = "Zzz"; 

VideoObj a = new VideoObj(title,year,director); 
VideoObj b = new VideoObj(title2,year,director); 

Assert.assertTrue(a.compareTo(b) == -b.compareTo(a)); 

Assert.assertTrue(a.compareTo(b) == -b.compareTo(a));ステートメントの意味は?アサーションcompareTo in java

私は説明を得ることができますか?

おかげ

答えて

0

は、私は、これはcompareTo()メソッドが正しく実装されていることをテストしていると思うhttp://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Comparable.html#compareTo%28java.lang.Object%29

を参照してください。 Comparableインタフェース

a.compareTo(b) == -b.compareTo(a) 

のいずれかの実装で

常に真でなければなりません。そうでない場合は、compareTo()を使用する操作(オブジェクトのソートなど)を実行するときに無意味な結果が得られます。

更新::正常に動作するには、記号のみが反対である必要があります。 - 値がに等しいことをテストすることは、これを確実にするために反対の符号があります。厳密に厳密なテストより厳しいテストです。あなたが渡している比較はあなたがのcompareToのための一貫した値を取得している場合は、この行がチェックされ

falseの場合

+0

_sign_は反対である必要がありますが、値そのものを否定する必要はありません。たとえば、 'a.compareTo(b)'は '2'を返し、' b.compareTo(a) 'は-1を返します。 –

+0

@ルイス、それはそうではありません - 提供されたリンクを見てください: "実装者はすべてのxとyに対してsgn(x.compareTo(y))== -sgn(y.compareTo(x))を保証する必要があります。そして、なぜ誰もがまだJava4のものにリンクしています。彼らは暗黒時代に住んでいるようです:-) – paxdiablo

+0

はい、sgnは記号を指します。ちょうど私が言ったように。 ;)(また、私は、最初にGoogleの結果を選ぶこともありますが、時には古いものです...) –

1

Assert.assertTrueは、例外が発生します。

のCompareToは対称的である必要があり、あなたは-のを意味は無地でシンプルな、否定されることにより、-1

+0

私はあなたが言っていることを理解していますが、コミット不可能な用語です。数学では、順序を変更することはできますが、15 * 3の10 + 2や7-3や12/4のような同じ結果が得られることを意味します。 CompareToは、コミッタブルであれば、うまく機能しません:-)残念ながら、私はそれを記述するために単純な1語の用語を考えることはできません。 – paxdiablo

+0

申し訳ありませんが、これは翻訳で失われた、私は対称のようなものを意味していました。 1つの良い単語に他の提案はありますか? –

+0

Javaと数学の両方でこれに "symmetric"という単語が使われています(JavaDocの 'Object#equals(Object)'参照)。 –

4

オペランドの順序を変更し、その結果を乗じてこれを確認することができます。私は数値比較のイディオムが、比較によって-1,0または+1という値を返すことを見てきました。 -n0+nnは同じです)でも同様の効果があります。

オペランドを逆にすると、オペレーションがと反対のの値になることを単純にチェックしています。言い換えれば、compareToが期待どおりに機能するという主張です(ただし必ずしも保証されているわけではありません - 下記参照)。

a < bb < a場合(つまり、a、より少ないとbより大きいの両方である)、そして、あなたはCompareTo documentationから

:-)固定必要が深刻な問題があります。

実装者は、すべてのxとyに対してsgn(x.compareTo(y))== -sgn(y.compareTo(x))を保証する必要があります。上記の説明において、sgn(expression)は、expressionの値が負であるか、ゼロであるか、または正であるかに応じて、-1,0または1のいずれかを返すように定義された数学的なsignum関数を指定する。その上で

それがCompareToの実装が(ゼロ近傍)の値を対称返すことが保証されていること、余分な知識を持っていない限り、アサーションは、それはむしろちょうどa.compareTo (b)よりInteger.signum (a.compareTo (b))を比較する必要があり、非常に適切ではありません。

+1

+1 - よく言われました。 – YumYumYum

+0

標識の明確化のためにupvoteを持ってください。 ;) –

0

compareToの実装を参照することが有用であると思いますが、基本的主張はa <= bが定義された比較基準(番号のないリテラル<=>=事業者)のためにそのb >= aを意味することをテストしています。比較が失敗した場合は、compareToメソッドが期待どおりに動作していないことを意味します。与えられた情報で

、一つの可能​​性はa辞書式順序の下のタイトルのタイトルがb未満である "場合VideoObj aVideoObj b「未満」であるということです。

0

a.compareTo(b);

この方法: 戻る1の場合> B 戻り-1 B場合> 戻り0 = B

もしそうなら、それは 及びB> A> Bため> Bを変更しますa> b

a.compareTo(b)と-b.compareTo(a)は同じです。書かれたよう

1

、声明でも、行うことになっているように見える何をしません...

ラインは

Assert.assertTrue(Integer.signum(a.compareTo(b)) == -Integer.signum(b.compareTo(a)); 

すべきであり、それは順序があることをテストしantisymmetricつまり、a < bの場合はb > aとなりますので、順序付けは定義による必要があります。

+0

あなたは_definitely_に 'signum'を必要としません、CompareToドキュメントは、signumが使用されたように返されることを指定します。 – paxdiablo

+0

False。ドキュメントの2番目の文: "負の整数、ゼロ、または正の整数を返します..." –

+0

謝罪、ドキュメントを誤読。 – paxdiablo