根据对象元素删除数组列表中的重复项

时间:2014-12-16 22:44:35

标签: java arraylist

好的,所以我知道很多次都会问这个话题。所有通常都指的是使用某种类型的集合。

现在问题就在于此。

我有一个RateSheet(ArrayList),里面有很多费率(对象)。在这个速率对象中,我们有变量:

desName 字首 成本

现在总结一下,我想拿这个RateSheet并根据desName删除所有重复的费率。

我已经使用了一个集合和集合。哪个有效,但随后我无法访问单个对象,然后访问其变量等,因为我遇到了错误。所以我在尝试不使用套装。

4 个答案:

答案 0 :(得分:1)

我假设您正在从价目表中创建一个集合,并在其中注入每个价目表的desName。

不幸的是,Set api基于equals方法和hashCode方法,因此一旦你根据desName属性对equals和hashCode进行了补充,你的集合将包含关于desName的唯一速率表对象,如果你想要它们对于前缀是唯一的,你必须改变equals方法和hashCode方法。

我过去通过在费率表中插入一个链接到desName或前缀的适配器来完成类似的操作,因此hashCode重定向到" hashCode"由当前适配器提供。

答案 1 :(得分:1)

  Set<String> s = new HashSet();
  for(int i=0;i<RateSheet.size;i++){
     Rate rate = (Rate)RateSheet.get(i);
     s.add(rate.desName);
    }

Set<Rate> rs = new HashSet();

  for(int i=0;i<RateSheet.size;i++){
     Rate rate = (Rate) RateSheet.get(i);
    Iterator it = s.iterator();
     while(it.hasNext()){
      if(rate.desName.equals(it.next()){
            rs.add(rate);
       }
    }
 }

答案 2 :(得分:0)

以下是有关如何使用Set执行此操作的示例代码。你需要覆盖hashCode()和equals(),因为它们被用在底层以找出什么是重复的,什么不是:

import java.util.HashSet;

public class RateSheet
{
    private String desName;

    public RateSheet(String name)
    {
        desName = name;
    }

    @Override
    public boolean equals(Object other)
    {
        if (other == null) return false;
        if (other == this) return true;
        if (!(other instanceof RateSheet))return false;
        RateSheet otherAsRateSheet = (RateSheet)other;

        return desName.equals(otherAsRateSheet.desName);
    }

    @Override
    public int hashCode()
    {
        return desName.hashCode();
    }

    public static void main(String[] args)
    {
        HashSet<RateSheet> sheets= new HashSet<RateSheet>();

        RateSheet a = new RateSheet("a");
        RateSheet b = new RateSheet("a");
        RateSheet c = new RateSheet("b");

        System.out.println(sheets.add(a));
        System.out.println(sheets.add(b));
        System.out.println(sheets.add(c));
    }
}

这是基于此处的其他答案: Java Set collection - override equals method 还有这一个: Why is equals() not called while adding to HashSet and hashCode matches? 以及@GerritCap发布的内容。 (对不起,我有点慢)

答案 3 :(得分:0)

List<RateSheets> dedupSheets(List<RateSheet> sheets) {
    Map<String,RateSheet> map = new HashMap<>();
    for(Rate r: sheets) map.put(r.getName(), r);
    return new ArrayList<>(rateSheets.values());
}