2011-12-11 18 views
1

私は問題があります。まず、私はあなたに私が比較できるようにしたい豆の構造を示してみましょう:それぞれ2つの豆に応じて複数のプロパティを持つ豆を比較する

ItemDTO含まれています

  • ITEMID
  • タイプ
  • サブタイプ
  • ボディ部
  • 価格

ItemOnCharacterDTOが含まれています:

  • OWNERID
  • ITEMID
  • 場所

ItemDTOは、XMLファイルから静的に読まです。何千もの人たちが変わりません(少なくとも現時点では気にしません)。 ItemOnCharacterDTOsはです。 ownerID、itemID、countおよびlocationは文字ごとに異なるため、データベースに保存されます。ここのitemIDは有効なItemDTOに対応しています。

私は、複数の条件で並べ替えるItemOnCharacterDTOオブジェクトの配列(またはArrayList)を持っています。 「itemOnCharacterDTO.ownerID」、「itemDTO.name」、「itemDTO.type」である。

ItemDTOとItemOnCharacterDTOを1つのクラス(ItemAllDTOなど)にまとめると、簡単にapache BeanComparatorを使用できます。しかし、私はそうではありません。 理由は次のとおりです。ユーザーは異なる文字に複数の項目を含めることができます。基本的な項目データ(ItemDTOデータ)は同じであり、ユーザ固有のデータ(ItemOnCharacterDTOデータ)は変更される。したがって、私は前者を一度だけロードし、別のItemOnCharacterDTOに出会うたびにユーザー固有のデータをロードします。

私はGWTにすべてを書いているので、サーバー上で並べ替えることにしました。なぜなら、すべての情報は(フロントエンドとは異なり、アイテム関連の情報がページネーションで読み込まれるのとは対照的です)。私はサーバー側でJavaを使用しています。アイテム関連のXMLファイルから静的なXMLデータを適切に取得するためのマッパーを作成しました。しかし、文字ベースのアイテム関連の情報は、mysqlデータベースに保存されています。私はItemOnCharacterDTO-またはItemDTOオブジェクトのいずれかに存在する属性によってItemOnCharacterDTOsの配列やArrayListのを並べ替えることができるようにしたい

(私は特定の属性DTOに属するものを区別するための方法を持っている - の意味:私はかどうかを知りますユーザーは "count"でソートしますが、ItemDTOオブジェクトではなく、この属性に対してItemOnCharacterDTOオブジェクトをチェックする必要があります)。

各ユーザーには数千個のオブジェクトが含まれている可能性があります。各ItemOnCharacterDTOには約5つの属性がありますが、各ItemDTOには約25程度の属性があります。したがって、それらを1つのオブジェクトに結合することは、たとえ比較目的のためだけであっても、非常に遅くてメモリを消費するため、実際の選択肢ではありません。

誰かがより良いアプローチをしていますか?私はどんな助けもありがたいです。たとえ生のアイデアをあげたとしても。私はそれを解決します。

ありがとうございます!あなたの助けが大変ありがとう!

イゴール。

P.s .:ご不明な点がございましたら、お気軽にお問い合わせください。できるだけ早く返信いたします。 P.s.2:Java用に "LINQ"のようなものがありますか?多分私の問題を解決するのに役立つでしょうか?

+0

私はJXPathがあることを知りました。オブジェクトを照会できるのはJXPathです。 2つの豆に基づいて比較する方法がありますか? – Igor

答えて

0

そのとき、私はJoSQLを使用してしまいました。なぜなら、自分自身を含めほとんどの人が簡単に理解できる方法で動的なクエリを望んでいたからです。それは、私が結果セットをさまざまな方法で選択、比較、順序付け、制限することを可能にしました。

今日私は、私が当時何をしようとしていたか(おそらく、特定の項目を選択し、比較し、順序を決め、結果セットを制限するなど)、Java 8ラムダ式を使用するでしょう。私はデータを解釈するための他の手段があると信じています - 特にデータの量が巨大である場合は、それは当時のことではありませんでした。代わりにデータベースシステムの一部を再利用することを検討してください。

編集:私は決してJoSQLと提携していないので、私は問題を解決するために使っていました。

0

2つのハッシュマップを作成し、両方のキーを同じにしておきますが、オブジェクトは別のリストに含まれます。つまり、簡単にアクセスして簡単に一致させることができます。

両方のオブジェクトでequalsメソッドとhashcodeメソッドをオーバーライドすることもできます。

また、両方のオブジェクトを1つのオブジェクトにラップし、並べ替えに使用することもできます。

+0

オブジェクトを1つにまとめるのは恐ろしいですが、私はオブジェクトデータのディープコピーを作成することになります。それは私が避けたいのですが、データをコピーしてアイテムをソートして破棄することはばかげているので、ガベージコレクタが十分に機能するかどうかは不明です。だから、私は2つの異なるDTOにデータを保存したいのです。つまり、ItemDTOのデータは変更されません。追加のソート基準(名前、タイプ、価格など)だけが含まれています。だからソートするときに何とかその情報を考慮する必要があります。しかし、私はおそらくItemDTOをコピーする必要はありません。 – Igor

+0

いいえ、ディープコピーは必要ありません。ラッパーオブジェクトに参照を格納することができます。また、ラッパーでequalsをオーバーライドします。 –

0

両方のクラスのデータを考慮した独自のコンパレータを実装できます。助けとなる構造として、2つのマップを保持することができます。ここでkeyは両方のDTOのDTO idです。この方法で、比較のためにIDで2番目のDTOを見つけることができます。

+0

私はDTOを見つけるのに問題はありません - 私はたぶんそれらをコンパイラーメソッドに張り付けるだけです。私が確信しているのは、同じタイプの別のオブジェクト(例えば、thisItemDTO、thisItemOnCharacterDTO、anotherItemDTO、anotherItemonCharacterDTO)を考慮に入れたComparatorまたはCompareToメソッドを実際に記述する方法です。何かヒントはありますか?両方のDTOからのデータを含むオブジェクトを作成したくないので、私が従いたいアプローチはあなたのアプローチです。 – Igor

0

私はあなたがすでに正しいことをしていると信じています。 BeanCompartorまたはカスタムコンパレータを比較すると、オブジェクト階層をナビゲートすることによって比較する機能が提供されるはずです。だから、これは私が信じる正しい方法です。

+0

それは私が考えたものです。しかし、BeanComparatorは同じタイプの2つのBeanを比較できると思われます。私は実際にItemDnオブジェクトをItemOnCharacterDTO - itemIDに割り当て、それを後でドットを使ってアクセスするためにそれを接続することを除いて、もっと多くの情報を考慮に入れる方法はわかりません。しかし、それはオブジェクトデータを1つのオブジェクトにラップさせてしまいます。パフォーマンス上の理由から避けたいのですが(このオブジェクトデータは他の場所には必要ありません。ソート用にのみです。ばかげたパフォーマンス低下)。 – Igor

+0

さて、あなたはcutom caopmartorをBeanComparatorに渡すことができます。これはCompartorインターフェイスを実装している有名なクラスです。そして、内部でロジックが正しく比較されたメソッドを実装しています。 2番目の例を見てください。あなたが好きなら、あなたはあなたのItemCharacterDAOのitemIdからItemDAOを簡単に得ることができます。それは問題ではありません。 –

+0

申し訳ありませんがリンクを見逃してここに与えられた2番目の例:http://www.discursive.com/books/cjcook/reference/beans-sect-comparing –