私は他のコレクションの内容に従ってコレクションを掘り起こす必要があります。通常、私はCollection.retainAll()
メソッドを使用していました。
残念ながら、私が扱うドメインオブジェクトの等価性は、比較コンテキストによってはかなり変動します。したがって、私はequals/hashCode
に頼ることはできません。
私の次の反射は、カスタムComparator
を使用することでしたが、私が気にしていたことをサポートする方法は見つかりませんでした。機能を実装することは問題ではありませんが、私はここでホイールを改革する気がします。
私はAPIで何かを見逃しましたか?コモンズのような他のフレームワーク(それほど難解ではない)も歓迎します。
もしそうでなければ、どちらの最適化をすればよいでしょうか(両方のコレクションのすべてのアイテムをn^2のすべてのアイテムに渡すことによって、両方のコレクション内のすべてのオブジェクトのリストを作成する)良いものになりますか?カスタムComparatorsでretainAll()の実装がありますか?
3
A
答えて
3
Guava's filterをご提案ください。代わりにあなたのロールを回すことですretainAllBy(sourceCollection, Comparator)
。
1
APIで何か不足していますか?
何かによってretainAll
を行うのJavaコレクションフレームワーク、標準のequals
実装では何もありません。
は強くあなたのユースケースに応じて、あなたは、このようにそれを行うことができます。
が、あなたが必要とするequals
方法では、あなたのオブジェクトの周りに巻き付け可能なラッパーオブジェクトを作成します。そして、そのラッパーを使用してretainAll
を実行した後、結果のコレクションからオブジェクトをアンラップする必要があります。
しかし、この方法は、2つの欠点があります作成されるオブジェクトの
- たくさん
- ラッパーの
equals
方法がまだ有効である場合、それが唯一の正しい動作しないがjava doc for equals方法の面でequalsメソッドを。
1
Guavaは、この問題に対する厄介な解決策を持っています。Equivalence
です。 Equivalence.wrap()
を使用してオブジェクトを等価にラップし、ラップされたバージョンをコレクションに格納して、コレクションがカスタムequals/hashcodeロジックを使用するようにします。
I(および他の者)がEquivalence-based sets and mapsを要求しましたが、残念なことに、Guavaチームは、代わりに上記のルートを取るべきだと提案します。
関連する問題
- 1. カスタムASP.NETコアオプションはIOptions <>を実装する必要がありますか?
- 2. カスタム挿入動作が必要な場合、RowSorterのカスタム実装を行う必要がありますか?
- 3. UISplitViewController - カスタム実装なしでオートローテーションする方法はありますか?
- 4. SqlGeometryBuilderの実装はありますか?
- 5. C#でファイルパイプの実装がありますか?
- 6. IdentityServer3では、トークンとクレームをカスタムTokenHandleStore実装でどのようにリンクする必要がありますか?
- 7. このrwLock実装に何か問題がありますか?
- 8. HttpServletRequestを実装していないServletRequest実装がありますか?
- 9. CreateParamに実装がありません
- 10. カスタム実装::ベクトル
- 11. デフォルトのインターフェイスメソッドを実装する必要がありますか?
- 12. カスタムEhCacheの実装
- 13. カスタムUINavigationControllerの実装
- 14. カスタムComparableBindingの実装
- 15. カスタムSessionIDManagerの実装
- 16. MSPのカスタム実装
- 17. ODataサーバーまたはカスタムXSJSサービスの実装を使用する必要がありますか?
- 18. Java7のHashmap実装がJava8の実装よりも優先されるシナリオがありますか
- 19. wxPythonには、FlowLayoutManager/FlowSizer/WrapSizerのネイティブ実装がありますか?
- 20. ATSに優先キューの実装がありますか?
- 21. C#にはクライアント側のデータベース実装がありますか
- 22. tensorflowに畳み込みlstmの実装がありますか?
- 23. DbDataReaderにIQueryableの実装がありますか?
- 24. javaにLINQのような実装がありますか?
- 25. Pythonにlibjpegの実装がありますか?
- 26. pythonにスタンドアロンのpgp実装がありますか?
- 27. epollの実装にはrfcがありますか?
- 28. C#にSizzle/jQueryセレクタの実装がありますか?
- 29. Pythonに_rational_ interval算術の実装がありますか?
- 30. jQueryにリボンの実装がありますか?
もう1つのグアバ解決策は、おそらく私の –
よりも優れています。これを行うには、Predicateでコレクションをラップしてからフィルタリングします。いいですね。ありがとうございました – kostja