LoginSignup
0
2

More than 5 years have passed since last update.

重複する値を含むコレクションからユニークな値のコレクションを生成する

Posted at

概要

下記のような重複する値を持つコレクションから、重複する値には連番を付けてユニークな値のコレクションを返すサンプルコードです。

List<String> list = Arrays.asList("a", "b", "c", "a", "b", "b", "d", "a", "b");

なお、重複しない値(または最初の値)には連番は付けず、重複したときに2以降の連番を付加します。
たとえば

a, a, b, c, c, c

a, a_2, b, c, c_2, c_3

のようにします。

サンプルコード

public static class UniqueValue {
    private Map<String, Integer> cache = new HashMap<>();

    String get(String name, Integer idx) {
        String tmp;
        if (idx > 1) {
            tmp = name + "_" + idx.toString();
        } else {
            tmp = name;
        }
        if (!cache.containsKey(tmp)) {
            cache.put(tmp, idx);
            return tmp;
        }
        // 重複している場合は連番を加算して再帰する
        return get(name, idx + 1);
    }

    void dump() {
        cache.entrySet().forEach(e -> {
            System.out.println("dump: key=[" + e.getKey() + "] i=[" + e.getValue() + "]");
        });
    }
}

実行する

List<String> list = Arrays.asList("a", "b", "c", "a", "b", "b", "d", "a", "b");

UniqueValue un = new UniqueValue();
Set<String> unique = list.stream()
    .sorted()
    .map(name -> un.get(name, 1))
    .collect(Collectors.toSet());

unique.forEach(System.out::println);
// → a
// → b
// → c
// → a_3
// → b_2
// → d
// → a_2
// → b_4
// → b_3

un.dump();
// → dump: key=[a] i=[1]
// → dump: key=[b] i=[1]
// → dump: key=[c] i=[1]
// → dump: key=[a_3] i=[3]
// → dump: key=[b_2] i=[2]
// → dump: key=[d] i=[1]
// → dump: key=[a_2] i=[2]
// → dump: key=[b_4] i=[4]
// → dump: key=[b_3] i=[3]
0
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2