[JAVA] Generieren Sie eine eindeutige Auflistung von Werten aus einer Auflistung, die doppelte Werte enthält

Überblick

Dies ist ein Beispielcode, der eine eindeutige Sammlung von Werten zurückgibt, indem die duplizierten Werte aus einer Sammlung mit doppelten Werten wie unten gezeigt fortlaufend nummeriert werden.

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

Beachten Sie, dass nicht überlappende Werte (oder der erste Wert) keine Seriennummer erhalten. Wenn sie dupliziert werden, wird nach 2 eine Seriennummer hinzugefügt. Zum Beispiel

a, a, b, c, c, c

Ist

a, a_2, b, c, c_2, c_3

Machen.

Beispielcode

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;
        }
        //Wenn es Duplikate gibt, fügen Sie Seriennummern und Wiederholungen hinzu
        return get(name, idx + 1);
    }

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

Lauf

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]

Recommended Posts

Generieren Sie eine eindeutige Auflistung von Werten aus einer Auflistung, die doppelte Werte enthält
RSpec-Sammlung, die ich häufig verwendet habe
Eine Sammlung von Befehlen, die häufig in Heroku verwendet werden
Eine Sammlung von Eclipse-Verknüpfungen, die neue Absolventen nützlich finden
Eine Sammlung von Phrasen, die das "unterschiedliche Gefühl" von Java und JavaScript beeindruckt
[Rails] Eine Sammlung von Tipps, die sofort zur Verbesserung der Leistung hilfreich sind
Bedeutung der aus der Java Collection gelernten Schnittstelle
Ein Programm, das die Leistung von 2 bis 100 berechnet
Finden Sie den Unterschied von einem Vielfachen von 10
Es ist gerade erst, aber eine Sammlung von Befehlen, die häufig in Rails angezeigt werden