0

对于以下情况,我需要您在 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]

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

提前致谢。

4

2 回答 2

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是不可变的(也就是说,在它创建后,它的值不会改变。然后您可以将它与哈希映射一起使用,以将所有具有相同名称的金额相加namesamount

    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对象以及每个对象的总数。

于 2012-06-15T22:11:57.243 回答
0

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

  • 将字符串拆分为定义分隔符的数组,例如"jony,john".split(",")将为您提供数组 {"jony","john"}
  • 对数组中的数据进行排序Arrays.sort(arrayToSort)
  • 比较数组是否相等(包含具有相同顺序的相同值)Arrays.equals(array1, array2)或通过使用比较其字符串表示Arrays.toString(array)
  • 使用 Maps(如 HashMap)来保存对 [key -> value]

有了这些,您就可以解决您的问题。

提示:您可以使用 Map like<String, Double>来统计您的数据。作为键(字符串),您可以使用名称的排序表示。如果 Map 已经包含名称的某种排序表示,则增加存储在该键下的值。

于 2012-06-15T22:04:59.360 回答