1

二重リンクリストでcompareTo()を使用してコードと読み取り文字列を比較していますが、なぜ機能しないのか理解できません。たくさんのコードが含まれていますが、皆さんにすべてを読んでもらいたくないので、関連するものだけを投稿して、それで十分であることを願っています。

これはコード行です。私はそれが不完全であることを知っていますが、他のすべては正しく機能しています。

if(p.getCode().compareTo(str)==0){

そして、それらは等しいです。この比較が行われる直前にそれらを印刷しましたが、同じです。

あまり与えられていないことは承知しており、本当に平等であると信じていただきたいと思いますが、時間を節約するためです。私が見逃しているcompareTo()に関して知っておくべき特別なルールがあるかどうか疑問に思っています...

ありがとう。

4

4 に答える 4

3

compareToComparableインターフェースによって提供されます。Comparable.compareToを返す0ときにObject.equals戻るという言語強制要件はありませんtrue。つまり、オブジェクトの2つのインスタンスは完全に同一である可能性があり、の実装はComparator.compareToを返す必要はありません0

p.getCodeがaを返しString、引数strが、であると仮定するとString、の実装はとが一貫していることをString保証します。equalscompareTo

したがって、他の可能性があります。

  1. 一方または両方の引数に先頭または末尾のスペースがあります。デバッグログを追加するルートをたどる場合は、各文字列の前後にパイプ('|')文字を使用すると、スペースが表示されるので便利なことがよくあります。
  2. 大文字と小文字には違いがあります。文字列の比較では大文字と小文字が区別され、大文字と小文字を区別しない特別なComparatorものを使用する必要があります。
于 2012-10-16T21:50:36.747 に答える
1

同等性をテストするには、equals()の代わりに使用することをお勧めしcompareTo()ます。文字列に違いがある可能性があります。末尾のスペース、または大文字と小文字が一致しない場合があります。特に注意するために、これらの線に沿った何かが役立つかもしれません(両方の文字列がnullではないと仮定します):

if (p.getCode().trim().equalsIgnoreCase(str.trim())) {

さて、がそうp.getCode()でないStringか、そうでstrない場合String(コンパイラがオブジェクトのメソッドが存在しないと文句を言う場合はこれがわかりtrim()ます)...そこで問題が見つかりました-両方のオブジェクトが同等性をテストする前に同じタイプ。

于 2012-10-16T21:44:08.893 に答える
0

両方とも同じエンコーディングを使用していますか?ASCII文字列とUnicode文字列を比較する前に、特にテキストファイルを解析するときに問題が発生しました。

于 2012-10-16T21:48:11.933 に答える
0

ドキュメント String.compareTo()によると、String.equals()平等に関しては一貫しています

文字列が等しい場合、結果はゼロになります。compareToは、equals(Object)メソッドがtrueを返す場合に正確に0を返します。

違いを確認したい場合は、両方の文字列でtoCharArray()を使用し、各文字をintとして出力します。

于 2012-10-16T21:53:10.533 に答える