如何检查Set是否包含一个成员变量等于某个值的对象

时间:2011-05-13 07:13:12

标签: java set contains

我有一组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对象。

5 个答案:

答案 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另一个问题。