0

次の形式の文字列のリストがあるコマンドプログラムを作成しています。

AAA 100
BBB 200
CCC300
AAA 50

そして、望ましい出力は、最初の列をグループ化し、2 番目の列を要約することです。

AAA 150
BBB 200
CCC300

私は以下のコードを使用して動作しますが、これを行うにはもっとエレガントな方法が必要でしょうか?

public static Map<String, Integer> summarizeData(List<String> lines) {
    Map<String, Integer> map = new HashMap<String, Integer>();
    String[] temp;
    for (String line : lines) {
        temp = line.split("\\s+");
        if (map.containsKey(temp[0])) {
            int value = Integer.valueOf(temp[1])
                    + (Integer) map.get(temp[0]);
            map.put(temp[0], value);
        } else {
            map.put(temp[0], Integer.valueOf(temp[1]));
        }
    }
    return map;
}

どうもありがとう。

4

2 に答える 2

0

現在のソリューションでは、必ずしも行名が辞書順でソートされるとは限りません。以下の私の解決策を試してください。

public static Map<String, Integer> compile(final List<String> input) {
  final Map<String, Integer> map = new TreeMap<String, Integer>();
  final Pattern space = Pattern.compile("\\s+");
  for (final String line : input) {
    final String[] parts = space.split(line, 0);
    final String name = parts[0];
    final int addendum = Integer.valueOf(parts[1]);
    final Integer old = map.get(name);
    map.put(name, old == null ? addendum : old + addendum);
  }
  return map;
}

... を生成します:

AAA 150
BBB 200
CCC 300
于 2012-08-28T05:26:46.473 に答える
0

あなたのコードは問題なく動作しますが、単純に次のようにリファクタリングします。

public static Map<String, Object> summarizeData(List<String> lines) {
    Map<String, Integer> map = new HashMap<String, Integer>();
    for (String line : lines) {
        String[] temp = line.split("\\s+");
        Integer total = map.get(temp[0]);
        total = total == null ? 0 : total;
        map.put(temp[0], total + Integer.valueOf(temp[1]));
    }
    return map;
}
于 2012-08-29T00:37:36.580 に答える