根据Java中的属性查找重复的对象

时间:2019-02-14 12:34:56

标签: java

这是我的对象结构。

List<Customer> customerSelection = new ArrayList<Customer>();
    Customer c1 = new Customer();
    Customer c2 = new Customer();

    c1.setName("Syed");
    c2.setName("Syed");
    Map<String,String> locationList1 = new HashMap<String,String>();
    Map<String,String> locationList2 = new HashMap<String,String>();
    locationList1.put("DXB", "Dubai");
    locationList1.put("AUH", "Abudhabi");

    locationList2.put("DXB", "Dubai");
    locationList2.put("BAH", "Bahrain");

    c1.setLocationList(locationList1);
    c2.setLocationList(locationList2);

    customerSelection.add(c1);
    customerSelection.add(c2);

在这里,我想验证客户是否具有首选的重复位置,我应该抛出一条错误消息。关于优化解决方案有什么想法吗?

Syed在此处将迪拜作为位置列表中的位置,这是无效的。

3 个答案:

答案 0 :(得分:1)

您可以在添加时检查位置是否重叠:

safeAdd(customerSelection, c2);

如果两个指定的集合没有共同的元素,则使用Collections.disjoint返回true。

private static void safeAdd(List<Customer> customerSelection, Customer newCustomer) {
    if (customerSelection
            .stream()
            // look at all the users with matching name
            .filter(customer -> customer.name.equals(newCustomer.name))
            // ensure all of them have no location overlap with the new customer
            .allMatch(customer -> Collections.disjoint(customer.locationList.keySet(), newCustomer.locationList.keySet()))) {
        customerSelection.add(newCustomer);
    } else {
        throw new RuntimeException("Cannot add customer, customer with this name exists with this location");
    }
}

或Java 7:

private static void safeAdd(List<Customer> customerSelection, Customer newCustomer) {
    for (Customer customer : customerSelection) {
        if (customer.name.equals(newCustomer.name) &&
                !Collections.disjoint(customer.locationList.keySet(), newCustomer.locationList.keySet())) {
            throw new RuntimeException("Cannot add customer, customer with this name exists with this location");
        }
    }
    customerSelection.add(newCustomer);
}

答案 1 :(得分:0)

也请在这里看看

    public static void main(String[] args) {
        List<Customer> customerSelection = new NonDuplicateLocationsList();
        Customer c1 = new Customer();
        Customer c2 = new Customer();

        c1.setName("Syed");
        c2.setName("Syed");
        Map<String,String> locationList1 = new HashMap<String,String>();
        Map<String,String> locationList2 = new HashMap<String,String>();
        locationList1.put("DXB", "Dubai");
        locationList1.put("AUH", "Abudhabi");

        locationList2.put("DXB", "Dubai");
        locationList2.put("BAH", "Bahrain");

        c1.setLocations(locationList1);
        c2.setLocations(locationList2);

        customerSelection.add(c1);
        customerSelection.add(c2);
    }
}
class Customer {
    Map<String, String> locations;
    String name;

    public Map<String, String> getLocations() {
        return locations;
    }

    public void setLocations(Map<String, String> locations) {
        this.locations = locations;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class NonDuplicateLocationsList extends ArrayList<Customer> {


    @Override
    public boolean add(final Customer customer) {


        for (Customer customer1 : this) {
            if (Maps.difference(customer1.getLocations(),customer.getLocations()).entriesInCommon().size() > 0) {
                throw new RuntimeException("Has Location duplicates");
            }

        }
        return super.add(customer);
    }
}

答案 2 :(得分:0)

You can iterate through list and check whether HashMap has same key present in other Customer's locationList.

for(int i=0; i<customerSelection.size()-1;i++){
   for(int j=0;j<customerSelection.size()-1;j++){
     if(j!=i){
   HashMap map   =    customerSelection.get(i).getLocationList();
   for(Map.Entry<> entry: map.entrySet()){
      if(customerSelection.get(j).getLocationList().containsKey(entry.getValue())) {
        THROW ERROR               
             }
      }

      }
   }

}