2

我查找了与我的问题类似的问题,但我正在寻找在 java 内置数据结构的约束下的最佳解决方案。

我有两个纯文本文件。虽然 file1 有一个用户名列表,但 file2 有来自这些用户和其他人的 Twitter 帖子。推特帖子只是作为纯文本推送到文件中。

对于每个用户,如果存在帖子,我必须提取帖子中使用的所有不同主题标签(假设主题标签是整数并且每个帖子仅限于一行)。

这是我选择的数据结构

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

我解决问题的方法

  1. 读取 file1 以填充用户名键,将默认值设置为 null。
  2. 按顺序读取 file2,类似于 post = file2.readLine()
  3. 如果在 hashMap 键中找到帖子中的用户名,则将帖子中所有发现的主题标签添加到值 Set。

这种方法和选择的数据结构对于一百万用户(文件 1)和一千万个帖子(文件 2)来说听起来像是一个好方法吗?

4

2 回答 2

5

我会说你在重新发明轮子。当有优秀、快速、有能力、成熟、健壮和免费的 Java 关系数据库可用时,为什么还要担心创建自己的内存中关系数据模型。

如果我要这样做,我只需编写一个程序从文本文件中读取数据,然后将数据插入我的数据库。我推荐 HSQLDB。如果与单独提供的 JDBC 驱动程序一起使用,Apache Derby 也可以和 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 )
);

表推文被映射为与用户具有多对一关系(一个用户可能有许多推文);并且推文通过桥表tweet_tag_bridge 与标签具有多对多的关系。在桥接表中使用主键可确保标签对于任何单独的推文都是唯一的(即,任何推文都不应有多个标签)。

于 2013-06-04T14:08:52.703 回答
0

您可能想使用 aTreeSet<Integer>而不是 a LinkedHashSet<Integer>- 它会使用更少的内存(因为它没有负载因子)。

于 2013-06-04T14:07:04.207 回答