如何从Object类型的ArrayList中删除重复项?

时间:2014-06-18 12:35:30

标签: android arraylist hashset linkedhashset

我想删除ArrayListAlerts的重复项,其中Alerts是一个类。

课程提醒 -

public class Alerts implements Parcelable {
    String date = null;
    String alertType = null;
    String discription = null;

    public Alerts() {

    }

    public Alerts(String date, String alertType, String discription) {
        super();
        this.date = date;
        this.alertType = alertType;
        this.discription = discription;
    }
}

以下是我添加元素的方法 -

ArrayList<Alerts> alert = new ArrayList<Alerts>();
Alerts obAlerts = new Alerts();

obAlerts = new Alerts();
obAlerts.date = Date1.toString();
obAlerts.alertType = "Alert Type 1";
obAlerts.discription = "Some Text";
alert.add(obAlerts);

obAlerts = new Alerts();
obAlerts.date = Date2.toString();
obAlerts.alertType = "Alert Type 1";
obAlerts.discription = "Some Text";
alert.add(obAlerts);

我想从中删除 -

我想要所有具有唯一obAlerts.dateobAlerts.alertType的提醒。换句话说,请删除重复的obAlerts.dateobAlerts.alertType警报。

我试过了 -

Alerts temp1, temp2;
String macTemp1, macTemp2, macDate1, macDate2;

for(int i=0;i<alert.size();i++)
 {    
    temp1 = alert.get(i);  
    macTemp1=temp1.alertType.trim(); 
    macDate1 = temp1.date.trim();

    for(int j=i+1;j<alert.size();j++)
    {

         temp2 = alert.get(j);  
        macTemp2=temp2.alertType.trim();  
        macDate2 = temp2.date.trim();

        if (macTemp2.equals(macTemp1) && macDate1.equals(macDate2))  
        {   
           alert.remove(temp2);           
        } 

    }
 }

我也试过了 -

HashSet<Alerts> hs = new HashSet<Alerts>();
hs.addAll(obAlerts);
obAlerts.clear();
obAlerts.addAll(hs);

4 个答案:

答案 0 :(得分:4)

您需要通过覆盖一对方法来指定类如何决定相等性:

public class Alert {

    String date;
    String alertType;

    @Override
    public boolean equals(Object o) {
        if (this == 0) {
            return true;
        }
        if ((o == null) || (!(o instanceof Alert)))
            return false;
        }
        Alert alert = (Alert) o;
        return this.date.equals(alert.date)
                && this.alertType.equals(alert.alertType);
    }

    @Override
    public int hashCode() {
        int dateHash;
        int typeHash;
        if (date == null) {
            dateHash = super.hashCode();
        } else {
            dateHash = this.date.hashCode();
        }
        if (alertType == null) {
            typeHash = super.hashCode();
        } else {
            typeHash = this.alertType.hashCode();
        }
        return dateHash + typeHash;
    }
}

然后,您可以遍历您的ArrayList并添加元素(如果它们不在那里,因为Collections.contains()使用这些方法。

public List<Alert> getUniqueList(List<Alert> alertList) {
    List<Alert> uniqueAlerts = new ArrayList<Alert>();
    for (Alert alert : alertList) {
        if (!uniqueAlerts.contains(alert)) {
            uniqueAlerts.add(alert);
        }
    }
    return uniqueAlerts;
}

然而,在说了所有这些之后,您可能想要重新审视您的设计,以使用不允许重复元素的Set或其家族之一。取决于您的项目。 Here's a comparison of Collections types

答案 1 :(得分:2)

您可以使用Set<>。本质上,集合不包含重复项。您只需要确保使用正确的hashCode()equals()方法。

答案 2 :(得分:1)

Alerts课程中,覆盖hashCodeequals方法,使其依赖于您希望成为主键的字段的值。之后,您可以使用HashSet在迭代ArrayList时存储已见过的实例。当您找到不在HashSet中的实例时,请将其添加到HashSet,否则将其从ArrayList中删除。为了让您的生活更轻松,您可以完全切换到HashSet并完成重复项。

请注意覆盖hashCodeequalssome constraints apply

This thread有一些关于如何编写好的hashCode函数的有用指针。一个重要的教训是,简单地将所有依赖字段加在一起&#39; hashcodes是不够的,因为然后在字段之间交换值将导致相同的hashCodes,这可能是不可取的(比较交换名字和姓氏)。相反,某种移位操作通常在添加下一个原子哈希之前完成,例如。乘以素数。

答案 3 :(得分:-1)

首先将数据存储在数组中然后逐个分割,直到数据的长度执行,然后通过if条件与acyual数据进行比较并重新调整它,

HashSet<String> hs = new HashSet<String>(); 

for(int i=0;i<alert.size();i++)
{
    hs.add(alert.get(i).date + ","+ alert.get(i).alertType;
}

alert.clear();

String alertAll[] = null;
for (String s : hs) {   

    alertAll = s.split(",");
    obAlerts = new Alerts();
    obAlerts.date = alertAll[0];
    obAlerts.alertType = alertAll[1];
    alert.add(obAlerts);
}