我查找了与我类似的问题,但我正在寻找 java 内置数据结构的约束内的最佳解决方案。
我有两个纯文本文件。 file1 具有用户名列表,而 file2 具有这些用户和其他用户的 Twitter 帖子。 Twitter 帖子只是以纯文本形式插入文件中。
对于每个用户,如果存在帖子,我必须提取帖子中使用的所有不同主题标签 (假设主题标签是整数,并且每个帖子仅限于一行)。
这是我选择的数据结构
Map<String, LinkedHashSet<Integer>> usernames = new HashMap<>();
我解决问题的方法
- 读取 file1 以填充用户名键,将默认值设置为 null。
- 按顺序读取 file2,例如 post = file2.readLine()
- 如果在 hashMap 键中找到帖子中的用户名,请将帖子中所有发现的主题标签添加到值 Set 中。
对于 100 万用户(文件 1)和 1000 万个帖子(文件 2)来说,这种方法和选择的数据结构听起来像是一个好方法吗?
最佳答案
我想说你是在重新发明轮子。当有优秀、快速、强大、成熟、健壮且免费的 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被映射为与用户具有多对一的关系(一个用户可能有很多条tweets);推文通过桥接表 tweet_tag_bridge 与标签建立多对多关系。在桥接表中使用主键可确保任何单个推文的标签都是唯一的(即任何推文都不应具有多个标签)。
关于java - 特定文件处理需求的数据结构选择 - java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16919815/