我查找了类似于我的问题,但我正在寻找Java内置数据结构约束下的最佳解决方案。
我有两个纯文本文件。虽然file1有一个用户名列表,但file2有来自这些用户和其他用户的推特帖子。推文帖子只是作为文本中的纯文本推送。
对于每个用户,如果有帖子,我必须提取帖子中使用的所有不同的主题标签 (假设主题标签是整数,每个帖子都限制在一行)。
这是我选择的数据结构
Map<String, LinkedHashSet<Integer>> usernames = new HashMap<>();
我解决问题的方法
对于一百万用户(file1)和1000万个帖子(file2),这种方法和数据结构听起来是一种好方法吗?
答案 0 :(得分: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与标签建立了多对多的关系。在桥接表中使用主键可确保标签对于任何单个推文都是唯一的(即,任何推文都不应包含任何标签)。
答案 1 :(得分:0)
您可能希望使用TreeSet<Integer>
而不是LinkedHashSet<Integer>
- 它将使用更少的内存(因为它没有加载因子)。