1

これは、トリッキーなデータ構造とデータ編成のケースです。

大きなファイルからデータを読み取り、いくつかの(12未満の)グループに分類されてデータベースに保存されるさまざまなタイプ(、、、など)BooleanIntegerオブジェクトを生成するアプリケーションがあります。String

現在、各オブジェクトは単一のHashMap<String, Object>データ構造に格納されています。それぞれがHashMap単一のカテゴリ(グループ)に対応します。各データベースレコードは、すべてのカテゴリ(HashMapデータ構造)に含まれるすべてのオブジェクトの情報から構築されます。

HashMap後続のレコードが列の数とタイプで「同等」であるかどうかを確認するための要件が​​あります。ここで、各格納オブジェクトの名前(キー)とタイプ(実際のクラス)を比較することにより、すべてのマップで同等性を検証する必要があります。

元のオブジェクトの分類を維持しながら、この機能を効率的に実装する方法を探しています。これは、可能な限り最速の方法でオブジェクトをカテゴリ別に一覧表示することも要件であるためです。

キーを並べ替えて(たとえば、それぞれHashMapをに置き換えるTreeMapなど)、すべてのマップをウォークオーバーするというアイデアがあります。TreeMap別の方法は、比較の目的でのみ、のすべてをコピーすることです。

この機能を実装する最も効率的な方法は何でしょうか?

また、連続するレコード間の違い(つまり、追加されたフィールドと削除されたフィールド)をどのように見つけますか?

4

2 に答える 2

2

1 つの解決策は、カテゴリ ベースHashMapと結合の両方を維持することTreeMapです。ただし、両方で同じ参照を保持するだけなので、これにはわずかに多くのメモリ要件があります。

したがって、追加/削除するときはいつでもHashMap、同じ操作を行いTreeMapます。このようにして、両方が常に同期されます。

次に、オブジェクトのタイプの比較または実際のコンテンツの比較が必要かどうかに関係なく、比較に TreeMap を使用できます。

于 2012-04-28T15:26:51.960 に答える
2

作成したすべてのマップを格納するメタ SortedSet を作成します。

SortedSet<Map<String,Object>>たとえば、同じキーの数と名前、および値ごとに同じオブジェクトタイプの要件を正確にチェックTreeSetするカスタムとしての which を意味します。Comparator<Map<String,Object>>

次に、このメタ セット構造の contains() メソッドを使用して、同様のレコードが既に存在するかどうかを確認できます。

====編集====

そもそもデータベース レコードとマップの関係を誤解していたので、当然ながら、私の答えのセマンティクスを少し変更する必要があります。

それでも私は言及したものを使用しますSortedSet<Map<String,Object>>が、もちろん、Map<String,Object>あなたと hasxy が提案したそのマップを指すことになります。

一方、 or を使用することは、 KeyAndType に適切な実装の orを持つキーとタイプのみが含まれるSet<Set<KeyAndType>>orを使用することで一歩前進する可能性があります。SortedSet<Set<KeyAndType>>Comparableequals with hashcode

なんで?2 つのレコードの違いを見つける方法を尋ねましたか? 各レコードがこれらの内側のいずれかに関連している場合、2 つの連続するセットの共通部分をSet<KeyAndType>簡単に形成できます。retainAll()

これを a の考え方と比較するとSortedSet<Map<String,Object>>、両方の方法で、コンパレータ内のフィールドを区別するロジックが得られます。一度は内部セットを比較し、もう一度内部マップを比較します。この情報は、周囲のセットが構築されるときに失われるため、そのような違いを見つけるのに使いやすい別の縮小された構造がない場合、後で 2 つのレコード間の違いを取得するのは困難になります。このような は、Set<KeyAndType>2 つのレコードを比較するためのキーとして機能するだけでなく、簡単なベースとしても機能するため、両方の目的に使用するのに適した候補となる可能性があります。

Set<KeyAndType>さらに、レコードまたはメタ構造のグループとの関係を維持したい場合は、次のMap<String,Object>ようなものにするか Map<Set<KeyAndType>,DatabaseRecord>、元の順序で単純な反復を可能にする単純なものでMap<Set<KeyAndType>,GroupOfMaps>実装します。LinkedHashMap

于 2012-04-28T15:30:59.200 に答える