2015-12-28 60 views
0

我有一个对象的列表,我想检测对象ID是否重复。 这里是对象:检查arraylist中的重复对象id

public class data{ 
private String id; 
private String value; 
private String status; 
} 

所有重复data将有除了第一个“无效” status

这是最有效的方法是什么?

+3

没有太多的代码和辛勤工作......我只能说这圣诞奇迹! –

+0

看看这个[问题](http://stackoverflow.com/questions/27581/what-issues-should-be-considered-when-overriding-equals-and-hashcode-in-java) – user7

+0

我觉得他问题是与'私人字符串ID;'是'私人',并没有涉及到'对象'的真实ID ...但我可能是错的... – XenoRo

回答

-1

列出对象的id。循环播放对象列表。看看每个对象的id是否已经在列表中。如果id已经存在,则更改对象的status。否则,将对象的id添加到列表中。

+0

无需制作单独的列表。只需使用'Getter'并迭代+与之相比。 -1(直到固定)。 – XenoRo

+0

我们需要一个列表,以便对于列表中的对象只有具有唯一标识的第一个对象没有无效状态。我不是只检查一个对象,因此我需要一个列表。 –

+0

你*不需要第二个列表来知道第一个列表中是否有重复列表。你可以用一个简单的'loop'来检查多个对象。 – XenoRo

0

使用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 
} 
0

你可以考虑重写.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字符串

0

请先尝试像这样先覆盖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); 
       } 
      } 

     }