我有一个包含以下字段的java对象 -
public class Fruit {
private String name;
private String type;
private String color;
private String category;
private String description;
}
现在我有供应商A和供应商B销售的一套水果。两者都是散列集。
Set<Fruit> vendorA = new HashSet<Fruit>();
Set<Fruit> vendorB = new HashSet<Fruit>();
我想检查供应商A的水果,如果它具有供应商B的特定类型。在水果类中,我通过类型字段覆盖哈希码和等于。我知道如何在集合上使用contains方法。那不是我的问题。但如果供应商B中存在该类型,我需要获得供应商B的水果对象。我怎样才能实现这一目标?这里的下面部分是我的问题的伪代码 -
for(Fruit fruits : fruit) {
String type = fruits.getType();
if(vendorB.contains(type)) {
//get me the vendor B fruit object of that type
}
}
答案 0 :(得分:2)
按照您的方法,嵌套另一个循环。
for( Fruit fruitA : vendorA ) {
String typeA = fruitA.getType() ; // Use singular, not your plural.
for( Fruit fruitB : vendorB ) {
if( fruitB.getType().equals( typeA ) { … } // We have a hit.
}
}
更好的方法可能是实施Comparator
。如果您的真实业务场景语义与此处的示例类似,则重新定义equals
仅仅检查您的type
成员 。
答案 1 :(得分:1)
你应该扭转这个问题。
你想要A和B的交集但是B的果实
你循环vendorB
并检查每个水果是否在A中。
List<Fruit> fruits = vendorB.stream().filter(x->vendorA.contains(x)).collect(Collectors.toList());
如果使用 Set ,则会遇到一些问题,因为 Set 可以有一个每种类型的实例,因为您为此单一类型定义了equals和hashcode。这对你的功能很有用,但是有些错误。 所以你应该找到一些东西。
这就是我使用列表的原因。
答案 2 :(得分:0)
我建议使用嵌套循环:
for(Fruit fruit1 : fruit) {
String type = fruit1.getType();
for(Fruit fruit2 : vendorB){
if(fruit2.getType().equals(type)) return fruit2;
}
}
//return null?