繁体   English   中英

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

[英]How to check if a Set contains an object which has one member variable equal to some value

我有一组java的Result对象。 我的Result类定义如下所示:

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

我已将我的信息存储在名为Keywords的数据库表中,如下所示

关键字= [id,url,title,keyword,date-time]

如您所见,数据库中的对象和行之间没有一对一的映射。 我正在使用SQL(MySQL DB)来提取值并拥有合适的ResultSet对象。

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

如果集合已经包含带有当前URL的Result对象,我只想将extra关键字添加到Set of keywords中,否则我创建一个新的Result对象以添加到Result of Result对象。

当您遍历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)进行检查。

如果可能,我建议您更改数据库设计以消除此问题。 您当前的设计要求每个关键字存储一次id,url,title和date-time,如果你有很多关键词,可能会浪费相当多的空间

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

这有可能吗/这有意义吗?

您可以使用带有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);
    }
}

我认为你需要在Result类的equals()方法上进行覆盖。 在那种方法中,您将使用您的逻辑来检查您要查找的内容。

注意您还需要知道覆盖equals()方法,还需要覆盖hashCode()方法。

欲了解更多关于“重写equals()和hashCode()方法”主题,你可以看看一个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM