【发布时间】:2025-12-09 16:15:01
【问题描述】:
所以,我有两个集合,其中包含我的类 Capability 的元素。
public class Capability {
private String name;
public Capability(){
//
}
public Capability(String name){
this.name = name;
//this.id = count.getAndIncrement();
}
public String getName(){
return name;
}
@Override
public String toString(){
return "Capability: "+name+".";
}
}
请忽略该类在字符串上的值,这是为了将来扩展。
我正在尝试比较从导入 json 文件得到的两个集合,所以它们不是同一个对象,也不包含相同的对象,只是具有相同的内容。
public boolean allCapabilitiesMet(){
int count = 0;
for(Capability taskCap : this.getReqCapabilities()){
for(Capability primCap : this.getPrimitive().getCapabilities())
{
System.out.println(taskCap.equals(primCap));
System.out.println(taskCap.getName().equals(primCap.getName()));
if(taskCap.equals(primCap)){
count++;
}
}
}
return count == this.getReqCapabilities().size();
//return this.getPrimitive().getCapabilities().containsAll(this.getReqCapabilities());
}
目标是查看一个集合是否是另一个集合的子集,在我切换到从 json 文件导入之前,我可以使用注释返回来做到这一点。
问题是,我现在可以通过简单地将 if 子句更改为字符串比较来解决这个问题,因为这确实有效。一旦我开始向主类添加其他字段,这将是可怕的。
有什么办法可以在不手动检查内容的情况下比较集合内容吗?
【问题讨论】:
-
您可能只是调整 Capability 类的 equals 方法。现在它应该包括 name 属性。如果您要向该类添加其他字段,只需将它们包含在 equals 方法中。您甚至不需要带有 count 变量的嵌套循环 - 您可以简单地使用 Set 的方法进行操作。
-
@juwil 我想完全避免 for 循环,只做类似 containsAll() 的事情。如果不可能,那么……
-
这是可能的——但你必须为你的 Set 的成员实现 equals(和 hashcode btw.)。
-
非常混乱:标题说“不比较内容”,但有问题“比较集合内容” ?!?
-
@user16320675 是的,抱歉,我的问题是如果可能的话,如何在不手动检查内容的情况下实现类似于
return this.getPrimitive().getCapabilities().containsAll(this.getReqCapabilities());的东西。如果没有,我应该覆盖哪些方法
标签: java set comparison