【问题标题】:Check duplicate object id in arraylist检查arraylist中的重复对象ID
【发布时间】:2016-04-01 22:41:45
【问题描述】:

我有一个对象列表,我想检测对象 ID 是否重复。 这是对象:

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

所有重复的data 将具有“无效”status,但第一个除外。

最有效的方法是什么?

【问题讨论】:

  • 无需大量代码和辛勤工作...我会称之为圣诞奇迹!!
  • 看看这个question
  • 我认为他的问题在于private String id;private,与Object 的真实ID 无关...但我可能是错的...

标签: java arraylist duplicates hashset


【解决方案1】:

您可以考虑覆盖数据类的 .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 字符串而不是数据对象。

所以不是array_list.get(i).equals(arrayList.get(j), 你会这样做(假设你有数据私有成员的getter方法): array_list.get(i).get(id).equals(array_list.get(j).get(id));

或者,您可以使用类似于第一个方法并覆盖 .equals() 以仅比较 id 字符串。

【讨论】:

    【解决方案2】:

    使用 java ConcurrentHashMap 代替 arraylist。

    ConcurrentHashMap<yourid, YourBean> chp = new ConcurrentHashMap<>();
    chp.putIfAbsent(yourid, YourBean);
    

    并列出你所有的 id 做这样的事情

      for (Entry<yourid, YourBean> e : chp.entrySet()) 
    {
     YourBean object = (YourBean )chp.get(e.getKey());
    //do what u want with your object, guess that helps
    }
    

    【讨论】:

      【解决方案3】:

      首先尝试这样,您应该重写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);
                      }
                  }
      
              }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 无需单独列出。只需使用Getter 并与它进行迭代+比较。 -1(直到固定)。
        • 我们需要一个列表,这样对于对象列表,只有具有唯一 ID 的第一个对象没有无效状态。我不只检查一个对象,因此我需要一个列表。
        • 不需要需要第二个列表来了解第一个列表中是否有重复项。您可以使用简单的loop 来检查多个对象。
        猜你喜欢
        • 2013-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-22
        • 2018-03-08
        • 1970-01-01
        • 1970-01-01
        • 2011-05-24
        相关资源
        最近更新 更多