2011-05-13 86 views
0

我有一组java对象结果集。我的结果类的定义是这样的:如何检查一个Set是否包含一个成员变量等于某个值的对象

private String url; 
private String title; 
private Set<String> keywords; 

我已经存储了我的信息在数据库中的表名为关键词,看起来像这样

关键词= [ID,URL,标题,关键词,日期,时间]

正如您所看到的,数据库中的对象与行之间不存在一对一映射。我正在使用SQL(MySQL DB)来提取值并具有合适的ResultSet对象。

如何检查Set是否已经包含具有给定URL的Result。

如果该集合已经包含一个包含当前URL的Result对象,那么我只是想将其他关键字添加到关键字集合中,否则我会创建一个新的Result对象来添加到结果对象集合中。

回答

0

如果可能的话,我建议改变你的数据库设计来消除这个问题。您当前的设计请求会为每个关键字存储一次id,url,标题和日期时间,如果您有很多关键字,则可能浪费相当多的空间

我建议有两张表。假设id字段保证唯一,第一个表将存储id,url,title和date-time,并且每个id只有一行。第二个表格将存储id和一个关键词。根据需要,您可以在该表格中插入多行。

这有可能/有意义吗?

+0

这是有道理的,但它会减慢查询。我想知道是否有明显的解决方案。我可以把一些笨重但有效的东西放在一起。 – Ankur 2011-05-13 07:24:00

1

当您遍历JDBC结果集(创建自己的结果集)时,为什么不将它们放入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)来检查。

0

您可以使用的URL的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); 
    } 
} 
0

我认为你需要在平等的倍率(你的结果类的)方法。在这种方法中,你会把你的逻辑,将检查你在找什么。

N.B.您还需要知道重写equals()方法,您还需要重写hashCode()方法。

有关“覆盖equals()和hashCode()方法”主题的更多信息,您可以查看this另一个问题。

相关问题