这里有一个完整的新手,所以如果我的问题是愚蠢的,我道歉。我老实说在发帖之前就试过了。 我有一些客户列表,其客户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);
}
}
答案 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);
}
}
}