HashSet包含对象的方法

时间:2017-10-26 20:33:04

标签: java hashset

我有一个包含以下字段的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
    }
}

3 个答案:

答案 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?