我有一组java Result对象。我的Result类定义如下所示:
private String url;
private String title;
private Set<String> keywords;
我已将我的信息存储在名为Keywords的数据库表中,如下所示
Keywords = [id,url,title,keyword,date-time]
正如您所看到的,数据库中的对象和行之间没有一对一的映射。我正在使用SQL(MySQL DB)来提取值并拥有合适的ResultSet对象。
如何检查Set是否包含具有给定URL的结果。
如果集合中已包含带有当前URL的Result对象,我只想将extra关键字添加到Set of keywords中,否则我创建一个新的Result对象以添加到Result of Result对象。
答案 0 :(得分:1)
当您遍历JDBC resultSet(创建自己的结果集)时,为什么不将它们放入Map?在事后创建Map:
Map<String, List<Result>> map = new HashMap<String, List<Result>>();
for (Result r : resultSet) {
if (map.containsKey(r.url)) {
map.get(r.url).add(r);
} else {
List<Result> list = new ArrayList<Result>();
list.add(r);
map.put(r.url, list);
}
}
然后只需使用map.containsKey(url)
进行检查。
答案 1 :(得分:1)
答案 2 :(得分:0)
如果可能,我建议您更改数据库设计以消除此问题。您当前的设计要求每个关键字存储一次id,url,title和date-time,如果你有很多关键词可能会浪费相当多的空间
我建议有两张桌子。假设id字段被保证是唯一的,第一个表将存储id,url,title和date-time,并且每个id只有一行。第二个表将存储id和关键字。您可以根据需要在此表中插入多行。
这可能/有意义吗?
答案 3 :(得分:0)
您可以使用Map
将网址作为键:
Map<String, Result> map = new HashMap<String, Result>();
for (Result r : results) {
if (map.containsKey(r.url)) {
map.get(r.url).keywords.addAll(r.keywords);
} else {
map.put(r.url, r);
}
}
答案 4 :(得分:0)
我认为您需要对Result类的equals()方法进行覆盖。在那种方法中,你将使用你的逻辑来检查你在寻找什么。
N.B。您还需要知道覆盖equals()方法,还需要覆盖hashCode()方法。
有关“覆盖equals()和hashCode()方法”主题的更多信息,您可以查看this另一个问题。