我想删除ArrayList
类Alerts
的重复项,其中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.date
和obAlerts.alertType
的提醒。换句话说,请删除重复的obAlerts.date
和obAlerts.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);
答案 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
课程中,覆盖hashCode
和equals
方法,使其依赖于您希望成为主键的字段的值。之后,您可以使用HashSet
在迭代ArrayList
时存储已见过的实例。当您找到不在HashSet
中的实例时,请将其添加到HashSet
,否则将其从ArrayList
中删除。为了让您的生活更轻松,您可以完全切换到HashSet
并完成重复项。
请注意覆盖hashCode
和equals
,some 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);
}