-4

我想从where是一个类ArrayList的类型中删除重复项。AlertsAlerts

班级警报 -

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

4 回答 4

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 或其家族之一。取决于你的项目。这是集合类型的比较

于 2014-06-18T12:49:31.220 回答
2

你可以使用一个Set<>. 从本质上讲,集合不包括重复项。你只需要确保你有一个适当的hashCode()equals()方法。

于 2014-06-18T12:41:12.647 回答
1

在您的Alerts类中,覆盖hashCodeequals方法以依赖于您希望成为主键的字段的值。之后,您可以HashSet在迭代ArrayList. 当您找到不在 中的实例时HashSet,将其添加到 中HashSet,否则将其从 中删除ArrayList。为了让您的生活更轻松,您可以HashSet完全切换到一个并完成重复项本身。

请注意,对于覆盖hashCodeand equals应用了一些约束

这个线程有一些关于如何编写好的hashCode函数的有用指示。一个重要的教训是,简单地将所有相关字段的哈希码相加是不够的,因为在字段之间交换值将导致相同的哈希码,这可能是不可取的(比较交换名字和姓氏)。相反,通常在添加下一个原子散列之前完成某种移位操作,例如。与素数相乘。

于 2014-06-18T12:42:20.957 回答
-1

首先将您的数据存储在数组中,然后将其拆分为一个一个字符串,直到该数据的长度执行 arry 并通过 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);
}
于 2014-06-18T12:38:47.040 回答