等しいにもかかわらずHashSetで失敗したものを削除し、コードを実装しました

クレイグ

こんにちは私はいくつかのレガシーコードの統合テストを書いていて、次のことをしようとしています。2つのドキュメントのコレクションで取引を作成します。取引と文書を永続化します。取引を取得し、ドキュメントの1つを削除します。

ただし、HashSetからの削除は失敗します。equalsメソッドとハッシュコードメソッドはドキュメントクラスに実装されており、以下のコードでは、削除しようとしているドキュメントが実際にコレクション内のものと同じハッシュコードを持ち、「等しい」ことを確認します。ただし、削除はまだ失敗します。

HashSetとハッシュマップの実装コードをデバッグしたところ、ハッシュマップの内部で、メソッドreturnEntryForKeyが間違ったindexFor値を見つけているように見えますか?

私は愚かなことをしていますか?

    final Entry<K,V> More ...removeEntryForKey(Object key) {
    int hash = (key == null) ? 0 : hash(key.hashCode());
    int i = indexFor(hash, table.length);

.......。

    @Test 
    public void testDeleteOneOfTwoDocumentsOnlyRemovesOne() 
    { 
            Deal originalDeal = new DealBuilder().withProjectName("test-document-project");

            Document document1 = new DocumentBuilder().withActive(1).withName("Document One").build(); 
            Document document2 = new DocumentBuilder().withActive(1).withName("Document Two").build(); 

            Set<Document> documents = new MyHashSet<Document>(); 
            originalDeal.setDocuments(documents); 
            document1.setDeal(originalDeal); 
            document2.setDeal(originalDeal); 

            originalDeal.getDocuments().add(document1); 
            originalDeal.getDocuments().add(document2); 

            dao.save(originalDeal); 

            Deal savedDeal = dao.findById(originalDeal.getId()); 

            Set<Document> docs = savedDeal.getDocuments(); 

            assertEquals(2l, docs.size()); 

            long docIdToRemove = 0; 

            for (Document document : docs) 
            { 
                    docIdToRemove = document.getId(); 
                    break; 
            } 

            Document docToRemove = docDao.findById(docIdToRemove); 
            System.out.println(docToRemove.hashCode()); 

            for (Document document : docs) 
            { 
                    System.out.println("Hashcode equal? = " + (document.hashCode() == docToRemove.hashCode())); 
                    System.out.println("Objects equal? = " + (document.equals(docToRemove))); 
            } 

            boolean contains = docs.contains(docToRemove); 
            boolean check = docs.remove(docToRemove); 


    } 

    { 

    } 

}

彼らはいた

ドキュメントがセットに追加された時点では、idプロパティに値がありません。これは、カスケード永続化として取引オブジェクトの永続化時に追加されます。IDはハッシュコードの一部ですが、削除しようとしているアイテムはデータベースから取得されるため、IDもあります。

それがすべてを説明しています。

セットにドキュメントを入力すると、ドキュメントが保存されるインデックスは、入力時のhashCodeによって異なります。あなたが言うように、それはIDなしで計算されます。

セットからドキュメントを削除しようとすると、検索されるインデックスは、削除の試行時に削除しようとしているドキュメントのhashCodeによって異なります。n今回は、おっしゃるように、次のように計算されます。 idなので、hashCodeは異なります。

これらの2つのhashCodeが等しくない場合、削除するドキュメントは見つかりません。削除しようとしているドキュメントと同じhashCodeを持つドキュメントがセットにあるかどうかは関係ありません。これも同じです。

さらなる説明:

セットにドキュメントを追加すると、ドキュメントiが保存されるインデックスは次のように計算されます。

int hash = (key == null) ? 0 : hash(key.hashCode());
int i = indexFor(hash, table.length);

key.hashCode()ドキュメントのhashCodeはどこにありますか。

セットからドキュメントを削除しようとすると、iそのドキュメントが検索されるインデックスが同じ方法で計算されます。その間にドキュメントのhashCodeが変更された場合、計算iはおそらく異なり、ドキュメントは実際に配置されている場所で検索されないため、見つかりません。

問題を解決するには、idプロパティが設定された後でのみドキュメントをセットに追加する必要があります。それが不可能な場合は、古いセットのすべてのドキュメントを追加する新しいハッシュセットを作成できます。これにより、hashCodeの更新された値に基づいて、ドキュメントがHashSetに配置されます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

等しいにもかかわらずHashSetで失敗したものを削除し、コードを実装しました

分類Dev

テキストからreを使用しているにもかかわらず、削除に失敗しました– ''

分類Dev

HashSetは、hashCode()とequals()の両方を実装しているにもかかわらず、重複したエントリを追加します

分類Dev

タスクの1つが失敗したにもかかわらず、Gradleは終了コードを0として返します

分類Dev

トリガーを使用しているにもかかわらず、複合主キーで「UNIQUE制約に失敗しました」

分類Dev

GitHub Pagesは、何も変更しなかったにもかかわらず、Jekyllビルドの失敗通知を表示し始めました。最後に成功したビルドにリセットした後も通知は表示されます。

分類Dev

コードを変更しないにもかかわらずSaveAsが失敗する

分類Dev

@ConditionalOnPropertyにもかかわらず、間違った実装を使用して@Autowired

分類Dev

正しいURLにもかかわらず、「ダウンロードしたフォントのデコードに失敗しました」というメッセージが表示され続ける

分類Dev

ローカルで成功したにもかかわらず、Circleciでビルドが失敗する

分類Dev

画像の挿入に失敗しました。アクセス拒否。許可を与えているにもかかわらず

分類Dev

Djangoは、ユーザーの基準が正しいにもかかわらず、「致命的:ユーザーのパスワード認証に失敗しました」を受け取ります

分類Dev

コーダでは、クラスを登録しているにもかかわらず、 `KryoException:未登録のクラスIDが発生しました`

分類Dev

Twilio Ajaxの応答は、正常に電話をかけたにもかかわらず、常に「失敗」をトリガーします

分類Dev

UICollectionViewDataSource のメソッドを追加したにもかかわらず、エラーが発生します

分類Dev

AngularJS $ http.headは、200の応答が成功したにもかかわらず、ステータスコード0を表示しています

分類Dev

ALTER USER WITH PASSWORDクエリを正常に実行したにもかかわらず、ユーザーpostgresのパスワードを設定できません

分類Dev

ターミナルからファイルを読み取ることができるにもかかわらず、WiredTiger.wtの読み取りに失敗したため、MongDBをOpenShiftv3.11で起動できませんでした

分類Dev

Jenkins Mavenビルドは、ユニットテストに失敗したにもかかわらず成功を報告します

分類Dev

JPAクエリの検証は、コンソールで機能しているにもかかわらず、副選択で失敗します

分類Dev

ssh_keyが存在するにもかかわらず、Gitlab_ciで「ホストキーの検証に失敗しました」

分類Dev

エンコードを強制したにもかかわらず、NLTKのword_tokenizeのUnicodeDecodeError

分類Dev

正しい許可にもかかわらず投稿を削除できません

分類Dev

jenkinsからソナーを実行しているときにSCM情報の取得に失敗する理由:gitblameコマンドが失敗しました

分類Dev

すべてのテストに合格したにもかかわらず、Jenkinsビルドが失敗する

分類Dev

ジキルは以前にビルドしたにもかかわらず、ビルドを拒否しました

分類Dev

ifステートメントbash-正常に完了した場合は何もしないか、失敗した場合にのみ何かを実行します

分類Dev

状態を保存しないにもかかわらず、この数独ソルバーの実装はどのように機能しますか?

分類Dev

NSSetは、等しいにもかかわらずオブジェクトを含んでいませんでした

Related 関連記事

  1. 1

    等しいにもかかわらずHashSetで失敗したものを削除し、コードを実装しました

  2. 2

    テキストからreを使用しているにもかかわらず、削除に失敗しました– ''

  3. 3

    HashSetは、hashCode()とequals()の両方を実装しているにもかかわらず、重複したエントリを追加します

  4. 4

    タスクの1つが失敗したにもかかわらず、Gradleは終了コードを0として返します

  5. 5

    トリガーを使用しているにもかかわらず、複合主キーで「UNIQUE制約に失敗しました」

  6. 6

    GitHub Pagesは、何も変更しなかったにもかかわらず、Jekyllビルドの失敗通知を表示し始めました。最後に成功したビルドにリセットした後も通知は表示されます。

  7. 7

    コードを変更しないにもかかわらずSaveAsが失敗する

  8. 8

    @ConditionalOnPropertyにもかかわらず、間違った実装を使用して@Autowired

  9. 9

    正しいURLにもかかわらず、「ダウンロードしたフォントのデコードに失敗しました」というメッセージが表示され続ける

  10. 10

    ローカルで成功したにもかかわらず、Circleciでビルドが失敗する

  11. 11

    画像の挿入に失敗しました。アクセス拒否。許可を与えているにもかかわらず

  12. 12

    Djangoは、ユーザーの基準が正しいにもかかわらず、「致命的:ユーザーのパスワード認証に失敗しました」を受け取ります

  13. 13

    コーダでは、クラスを登録しているにもかかわらず、 `KryoException:未登録のクラスIDが発生しました`

  14. 14

    Twilio Ajaxの応答は、正常に電話をかけたにもかかわらず、常に「失敗」をトリガーします

  15. 15

    UICollectionViewDataSource のメソッドを追加したにもかかわらず、エラーが発生します

  16. 16

    AngularJS $ http.headは、200の応答が成功したにもかかわらず、ステータスコード0を表示しています

  17. 17

    ALTER USER WITH PASSWORDクエリを正常に実行したにもかかわらず、ユーザーpostgresのパスワードを設定できません

  18. 18

    ターミナルからファイルを読み取ることができるにもかかわらず、WiredTiger.wtの読み取りに失敗したため、MongDBをOpenShiftv3.11で起動できませんでした

  19. 19

    Jenkins Mavenビルドは、ユニットテストに失敗したにもかかわらず成功を報告します

  20. 20

    JPAクエリの検証は、コンソールで機能しているにもかかわらず、副選択で失敗します

  21. 21

    ssh_keyが存在するにもかかわらず、Gitlab_ciで「ホストキーの検証に失敗しました」

  22. 22

    エンコードを強制したにもかかわらず、NLTKのword_tokenizeのUnicodeDecodeError

  23. 23

    正しい許可にもかかわらず投稿を削除できません

  24. 24

    jenkinsからソナーを実行しているときにSCM情報の取得に失敗する理由:gitblameコマンドが失敗しました

  25. 25

    すべてのテストに合格したにもかかわらず、Jenkinsビルドが失敗する

  26. 26

    ジキルは以前にビルドしたにもかかわらず、ビルドを拒否しました

  27. 27

    ifステートメントbash-正常に完了した場合は何もしないか、失敗した場合にのみ何かを実行します

  28. 28

    状態を保存しないにもかかわらず、この数独ソルバーの実装はどのように機能しますか?

  29. 29

    NSSetは、等しいにもかかわらずオブジェクトを含んでいませんでした

ホットタグ

アーカイブ