0

次のシナリオに関して、JAVA の助けが必要です (可能であればサンプル コードを使用):
クラス オブジェクトを含むリストがあり、1 つのオブジェクト プロパティが重複しているかどうかを確認し、
そのうちの 1 つを保持し、保持された値で他の金額を追加します。一人分。例:
私はこのクラスを持っています:

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)
  • マップ(HashMapなど)を使用してペアを保持します[キー->値]

これらを使用すると、問題を解決できます。

ヒント:Maplikeを使用<String, Double>してデータをカウントできます。キー(文字列)として、名前のソートされた表現を使用できます。Mapにすでに名前の並べ替えられた表現が含まれている場合は、そのキーの下に格納されている値を増やします。

于 2012-06-15T22:04:59.360 に答える