有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java检查集合中是否包含对象

public class Address{
 private TypeAddress typeAddress;
 private String street;
 //Getters and Setters
 ...
}

public class TypeAddress{
  private String type;
  //Getters and Setters
  ...
}

我有一系列地址

Collection<Address> addresses = db.getAddresses();

我需要检查一下是否有客户会选择的地址类型。 这只是假装一种情况,好让你们理解

我想要的是,我只想得到一种类型的地址,即客户收到的类型。如果他选择了一个不存在的类型,我会选择另一个地址。 所以,我基本上需要做两个循环来检查是否有它的类型,如果有,我会在下一个循环中选择它。如果不是,我将在下一个循环中选择另一个。 有没有办法使用集合的contains方法来检查地址的类型是否符合我的要求

比如:

if(addresses.contains("someType")){//remind that I'm trying to check not the object Address, but the object TypeAddress
 //get this address
}else{
 //get another address
}

共 (6) 个答案

  1. # 1 楼答案

    //I found an example in a book:
    // e.g.
    Shape shape;
    if (shape instanceof Circle) {  
    //check if there is any class object Circle in  
    // the collection shape
    // take some action
    }
    
  2. # 2 楼答案

    使用Map<TypeAddress, Address>可以验证所需的地址是否存在,并相对快速轻松地获取它

    Map<TypeAddress, Address> addresses = new HashMap<TypeAddress, Address>();
    
    //put something and then
    TypeAddress type = getType();
    Address address = addresses.get(type);
    if (address != null) {
        return address;
    } else {
       //do smth else
    }
    

    别忘了以适当的方式重写类TypeAddress的方法equalshashCode

  3. # 3 楼答案

    我想你可能在寻找一种方法来打破一个循环,或者在循环的开始继续。非常方便,它们被称为breakcontinue

    for (Address address : addresses) {
        if (!address.getType.equals("someType")) continue;
        myAddress = address;
    }
    

    或者

    for (Address address : addresses) {
        if (address.getType.equals("someType")) {
            myAddress = address;
            break;
        }
    }
    
  4. # 4 楼答案

    您可以使用Apache CollectionUtils API:

    Predicate p = new Predicate()
    {
     public boolean evaluate(Object o)
     {
       return ((Adress) o).getTypeAddress().getType().equals(TYPE_INPUTED_BY_USER);
     }
    }
    
    return CollectionUtils.exists(p);
    
  5. # 5 楼答案

    如果你被迫使用一个集合(而不是像建议的那样使用一个映射),为什么不能迭代一次并将最“有希望”的实例存储为某个地址引用:

    Address address = null;
    for (Address addr : addresses) {
        if ( isBetterThanAlreadyFound(addr, address) ) {
            address = addr;
        }
    }
    
    
    private static boolean isBetterThanAlreadyFound(Address addr, Address alreadyFound) {
        return alreadyFound == null || (addr.isOfDesiredType() && alreadyFound.isNot());
    }
    
  6. # 6 楼答案

    即使包含内部循环逻辑,也要使用Map