在客户列表中识别重复的客户ID

时间:2016-10-19 05:31:48

标签: java list collections set hashset

这里有一个完整的新手,所以如果我的问题是愚蠢的,我道歉。我老实说在发帖之前就试过了。 我有一些客户列表,其客户ID为一列,客户名为另一列,年龄为第三列。

我想浏览此列表并确定同一个customerId是否在列表中不止一次。在这种情况下,我需要删除整个客户(即使他的姓名或年龄不同)。

您能告诉我们使用什么来做这个逻辑吗?

我尝试将客户添加到一个集合中(因为set不会添加重复项),但是如何声明不能在此列表中重复的是customerId而不是customer?

到目前为止,我在下面得到了这个,但在我的逻辑中没有任何说明当客户ID是重复时客户被认为是重复的。 (我不一定需要使用列表。客户是一个对象)。

   //Customer is a class that contains a private variable customerId, so I   can do customer.getCustomerId();

    List<Customer> notDuplicatedCustomers = new ArrayList<Customer>(); //list  of customers
    final Set<Customer> setToReturn = new HashSet<Customer>();
    final Set<Customer> initialSet = new HashSet<Customer>();

    for (Customer customer: notDuplicatedCustomers ) {
    if (!initialSet.add(customer)) {
    setToReturn.add(customer);
       } 
    }

5 个答案:

答案 0 :(得分:1)

  

我尝试将客户添加到一个集合中(因为set不会添加重复项),但是如何声明不能在此列表中重复的是customerId而不是customer?

如果您根据ID字段覆盖equals()方法,则可以执行此操作,从而告知设置两个客户在逻辑上相同(如果他们具有相同的ID)。这是我的IDE生成的示例实现(假设id的类型为String;如果类型是某种原始类型,则使用其包装器):

@Override
public boolean equals(final Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    final Student other = (Student) obj;
    if (id == null) {
        if (other.id!= null) {
            return false;
        }
    } else if (!id.equals(other.id)) {
        return false;
    }
    return true;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = (prime * result) + ((id == null) ? 0 : id.hashCode());
    return result;
}

final Set<Customer> myCustomerSet = new HashSet<Customer>();
myCustomerSet.add(customer1);
...

然后,当您将客户添加到集合中时,您应该只有一个具有相同ID的集合。 hashCode()对您的案例不是必需的,但通常如果您覆盖equals(),则还应覆盖hashCode()

答案 1 :(得分:0)

您可以使用HapMap,

List<Customer> lstCustomer = new ArrayList<Customer>(); // list of customer
Map<Integer,Customer> map = new HashMap<Integer, Customer>(); //here integer is your id type

for(int i=0;i<lstCustomer .size();i++){
    if(map.get(lstCustomer .get(i).getId())==null){
        map.put(lstCustomer .get(i).getId(),lst.get(i));
    }else{
        System.out.println(lstCustomer .get(i).getId()); // duplicate customer id
    }
}

希望它对你有所帮助。

答案 2 :(得分:0)

使用自定义比较器作为输入参数创建TreeSet。 里面的比较器写你的等于逻辑。 现在将每个客户添加到treeset。最终的树集不会有重复。

答案 3 :(得分:0)

您可以使用内置函数来编写自定义方法:frequency()

示例代码:

// Let us create a list with 4 items 
    ArrayList<String> list = 
                    new ArrayList<String>(); 
    list.add("Id100"); 
    list.add("Id101"); 
    list.add("Id100"); 
    list.add("Id100"); 

    // count the frequency of the duplicate Id "Id100" 
    System.out.println(Collections.frequency(list, "Id100"));  

谢谢

答案 4 :(得分:0)

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.*;

public class RemoveDuplicatesArrayListMain {

    public static void main(String[] args) {
        ArrayList employeeNameList = new ArrayList();
        employeeNameList.add("John");
        employeeNameList.add("Ankit");
        employeeNameList.add("Rohan");
        employeeNameList.add("John");
        employeeNameList.add("Amit");
        employeeNameList.add("Ankit");

        System.out.println("Removing duplicates from list:");
        // Using iterative approach
        ArrayList uniqueElements = new ArrayList();
        for (String empName : employeeNameList) {

            if (!uniqueElements.contains(empName)) {
                uniqueElements.add(empName);
            }
        }

        System.out.println("Using iterative approach:");
        for (String uniqElem : uniqueElements) {
            System.out.println(uniqElem);
        }
        System.out.println("*******************************");
        System.out.println("Using HashSet :");
        // using HashSet but does not maintain order
        uniqueElements = new ArrayList(new HashSet(
                employeeNameList));
        for (String uniqElem : uniqueElements) {
            System.out.println(uniqElem);
        }
        System.out.println("*******************************");
        System.out.println("Using LinkedHashSet :");
        // using LinkedHashSet maintaining order
        uniqueElements = new ArrayList(new LinkedHashSet(
                employeeNameList));
        for (String uniqElem : uniqueElements) {
            System.out.println(uniqElem);
        }

    }
}