2

私は私のものと同様の質問を調べましたが、Java 組み込みデータ構造の制約内で最適なソリューションを探しています。

2 つのプレーン テキスト ファイルがあります。file1 にはユーザー名のリストが含まれていますが、file2 にはそれらのユーザーや他のユーザーからの Twitter 投稿が含まれています。Twitter の投稿は、単純にプレーン テキストとしてファイルに押し込まれます。

ユーザーごとに、投稿が存在する場合、投稿で使用されているすべての個別のハッシュタグを取得する必要があります (ハッシュタグは整数で、各投稿は 1 行に制限されていると仮定します)。

これが私のデータ構造の選択です

Map<String, LinkedHashSet<Integer>> usernames = new HashMap<>();

問題への私のアプローチ

  1. file1 を読み取ってユーザー名キーを入力し、デフォルト値を null に設定します。
  2. post = file2.readLine() のように、file2 を順番に読み取ります。
  3. 投稿内のユーザー名が hashMap キーで見つかった場合、投稿内で検出されたすべてのハッシュタグを値 Set に追加します。

このアプローチと選択されたデータ構造は、100 万人のユーザー (ファイル 1) と 1,000 万の投稿 (ファイル 2) にとって適切なアプローチのように聞こえますか?

4

2 に答える 2

5

車輪の再発明をしていると言えます。優れた高速で有能な成熟した堅牢な無料の Java リレーショナル データベースが利用できるのに、独自のインメモリ リレーショナル データ モデルを作成することを心配する必要はありません。

これを行うとしたら、テキスト ファイルからデータを読み取り、そのデータをデータベースに挿入するプログラムを作成するだけです。HSQLDB をお勧めします。Apache Derby は、別売りの JDBC ドライバーで使用する場合、SQLite としても使用できます。

RDBM は、検索、保存、およびデータ マッピングを処理します。独自に開発しようとしたどのソリューションよりも、はるかに堅牢でパフォーマンスが高い可能性があります。

このプロジェクトで HSQLDB を使用する場合、私が作成する DDL は次のようになります。

CREATE CACHED TABLE Users (
    user_id       INTEGER       GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    :
    :

};

CREATE CACHED TABLE Tweets (
    tweet_id      INTEGER       GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    user_id       INTEGER       NULL,
    :
    :

    CONSTRAINT    twe_fk_user   FOREIGN KEY ( user_id ) REFERENCES Users ( user_id )
);

CREATE CACHED TABLE Tags ( 
    tag_id      INTEGER         GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
    :
    :

);

CREATE CACHED TABLE Tweet_Tag_Bridge (
    tweet_id     INTEGER       NULL,
    tag_id       INTEGER       NULL,

    CONSTRAINT   bridge_pk     PRIMARY KEY ( tweet_id, tag_id ),
    CONSTRAINT   brid_fk_twe   FOREIGN KEY ( tweet_id ) REFERENCES Tweets ( tweet_id ),
    CONSTRAINT   brid_fk_tag   FOREIGN KEY ( tag_id )  REFERENCES Tags ( tag_id )
);

テーブルのつぶやきは、ユーザーと多対 1 の関係を持つようにマップされます (ユーザーは多くのつぶやきを持つ場合があります)。ツイートは、ブリッジ テーブル tweet_tag_bridge を介してタグと多対多の関係にあります。ブリッジ テーブルで主キーを使用すると、タグが個々のツイートに対して一意であることが保証されます (つまり、どのツイートにも複数のタグを含めることはできません)。

于 2013-06-04T14:08:52.703 に答える
0

TreeSet<Integer>a の代わりに aを使用することもできます。LinkedHashSet<Integer>使用するメモリが少なくなります (負荷係数がないため)。

于 2013-06-04T14:07:04.207 に答える