我有一个对象的列表,我想检测对象ID是否重复。 这里是对象:检查arraylist中的重复对象id
public class data{
private String id;
private String value;
private String status;
}
所有重复data
将有除了第一个“无效” status
。
这是最有效的方法是什么?
我有一个对象的列表,我想检测对象ID是否重复。 这里是对象:检查arraylist中的重复对象id
public class data{
private String id;
private String value;
private String status;
}
所有重复data
将有除了第一个“无效” status
。
这是最有效的方法是什么?
使用java ConcurrentHashMap而不是arraylist。
ConcurrentHashMap<yourid, YourBean> chp = new ConcurrentHashMap<>();
chp.putIfAbsent(yourid, YourBean);
,并列出所有你的身份证做这样的事情
for (Entry<yourid, YourBean> e : chp.entrySet())
{
YourBean object = (YourBean)chp.get(e.getKey());
//do what u want with your object, guess that helps
}
你可以考虑重写.equals数据类的()方法。 这样做将允许你做以下检查重复元素:
ArrayList<data> array_list = new ArrayList<data>();
// add some elements to array list
// check for duplicates
for(int i =0; i < array_list.size(); i++){
for(int j=0; j<array_list.size(); j++){
// compare for equality if it is not the same element
if(i != j){
if(array_list.get(i).equals(arrayList.get(j))){
// than we know there is a duplicate at index i,j
System.out.println("duplicate indexes: " + i + ", " + "j");
}
}
}
}
下面是如何覆盖数据类的.equals方法的例子。
@Override
public boolean equals(Object obj) {
if (!(obj instanceof data)){ return false; }
if (obj == this) { return true; }
// compare strings to see if they are equal
data other_data = (data)obj;
boolean id_equal = other_data.id.equals(this.id);
boolean value_equal = other_data.value.equals(this.value);
boolean status_equal = other_data.status.equals(this.status);
return id_equal && value_equal && status_equal
}
编辑 如果你只是想知道的ID是否相等或不你不需要重写数据类的.equals()。
在这种情况下,您只需要使用第一个循环并比较id stings而不是数据对象。
所以不是array_list.get(I).equals(arrayList.get(J), 你会做(假设你有数据的私有成员)getter方法: array_list.get(I)不用彷徨(ID).equals(array_list.get(J)获得(ID));
另外,您可以使用类似于第一种方法,并覆盖.equals()只比较ID字符串
请先尝试像这样先覆盖equals
检查重复的方法
private class data{
private String id;
private String value;
private String status;
public data(String id, String value, String status) {
this.id = id;
this.value = value;
this.status = status;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@Override
public String toString() {
return "data{" +
"id='" + id + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof data)) return false;
data data = (data) o;
return !(id != null ? !id.equals(data.id) : data.id != null);
}
@Override
public int hashCode() {
return id != null ? id.hashCode() : 0;
}
}
然后测试这样
public class Test {
public static void main(String[] args) {
List<data> dataList=new ArrayList<>();
dataList.add(new data("1","somevalue","somestatus"));
dataList.add(new data("1","somevalue","somestatus"));
dataList.add(new data("1","somevalue","somestatus"));
dataList.add(new data("2","somevalue","somestatus"));
dataList.add(new data("3","somevalue","somestatus"));
List<data>validList=new ArrayList<>();
List<data>duplicateList=new ArrayList<>();
for (data data:dataList){
if (!(validList.contains(data))){
validList.add(data);
System.out.println(validList);
}else{
duplicateList.add(data);
System.out.println(duplicateList);
}
}
}
没有太多的代码和辛勤工作......我只能说这圣诞奇迹! –
看看这个[问题](http://stackoverflow.com/questions/27581/what-issues-should-be-considered-when-overriding-equals-and-hashcode-in-java) – user7
我觉得他问题是与'私人字符串ID;'是'私人',并没有涉及到'对象'的真实ID ...但我可能是错的... – XenoRo