如何保留一个并删除其他重复的arrayList对象并更新另一个对象属性?

时间:2012-06-15 21:30:01

标签: java collections arraylist

对于以下情况,我需要您在JAVA中的帮助(如果可能,请提供一些示例代码):
我有一个带有类对象的列表,并想要检查一个对象属性是否有重复,然后保留其中一个并添加其他金额与保留的金额。例如: 我有这个班:

class Salary {
    String names;
    Double amount;
}

并且列表说salary_list包含以下元素(例如):

[jony,john   300.96]
[fuse,norvi,newby  1000.55]
[john,jony  22.6]
[richard,ravi,navin  55.6]
[fuse,norvi,newby  200.6]
... ... ...

那么我的预期输出是相同的输入列表,其中包含以下修订结果:

[jony,john  323.56]
[fuse,norvi,newby  1201.15]
[richard,ravi,navin  55.6]

N.B :名称中的顺序并不重要,因此重复排除后的元素顺序不重要。
我不擅长英语和Java。如果有任何错误,请原谅我。

提前致谢。

2 个答案:

答案 0 :(得分:1)

按如下方式增强Salary课程:

class Salary {
    String names;
    Double amount;
    private String sortedNames = null;

    @Override
    public boolean equals(Object o)
    {
        if (o == null || ! (o instanceof Salary)) return false;
        Salary othr = (Salary) o;
        String thisNames = this.getSortedNames();
        String othrNames = othr.getSortedNames();
        return thisNames.equals(othrNames);
    }

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

    public String getSortedNames()
    {
        if (this.sortedNames == null)
        {
            String[] nameArr = this.names.split(",");
            Arrays.sort(nameArr);
            StringBuilder buf = new StringBuilder();
            for (String n : nameArr)
                buf.append(",").append(n);
            this.sortedNames = buf.substring(buf.length()==0?0:1);
        }

        return this.sortedNames; 
    }
}

这假定Salary是不可变的(也就是说,在创建names之后,amount的值不会改变。然后您可以使用哈希映射来添加所有具有相同名称的金额。

    Map<String,Salary>  map  = new HashMap<String,Salary>();
    for (Salary s : list)
    {
        Salary e = map.get(s.getSortedNames());
        if (e == null)
            map.put(s.getSortedNames(), s);
        else
            e.amount += s.amount;
    }

此时map包含所有唯一Salary个对象,每个对象的总金额。

答案 1 :(得分:0)

您在Java中几乎没有非常有用的工具。你可以

  • 将字符串拆分为数组,定义"jony,john".split(",")之类的分隔符将为您提供数组{“jony”,“john”}
  • Arrays.sort(arrayToSort)
  • 对数组中的数据进行排序
  • 比较数组是否相等(包含相同顺序的相同值)Arrays.equals(array1, array2)或使用Arrays.toString(array)比较其字符串表示
  • 使用地图(如HashMap)来保持对[key - &gt;值]

通过这些,您可以解决您的问题。

提示:您可以使用<String, Double>之类的地图来计算数据。作为键(String),您可以使用名称的排序表示。如果Map已包含某些名称的已排序表示,则增加存储在该键下的值。