[JAVA] Klasse zu zählen

Wenn Sie das Problem lösen, erhalten Sie möglicherweise eine Zählung.

Verwenden Sie ein Array

Wenn der Maximalwert bekannt ist und im Array gesichert werden kann.

Main.java


    public static void main(String[] args) {
        int[] ary = { 1, 2, 2, 3, 3, 3, 9, 8 };
        int[] cnt = new int[10];
        for (int v : ary) {
            cnt[v]++;
        }
        for (int i = 0; i < cnt.length; i++) {
            if (cnt[i] > 0) {
                System.out.println(i + ":cnt=" + cnt[i]);
            }
        }
    }

Wenn du rennst ...

1:cnt=1
2:cnt=2
3:cnt=3
8:cnt=1
9:cnt=1

Zählerklasse, die HashMap verwendet

Verwenden Sie HashMap, wenn Sie den Maximalwert nicht kennen oder wenn er zu groß ist, um ihn in einem Array zu reservieren. Natürlich muss die Anzahl der Registrierungen in den Speicher passen.

Counter.java


import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Counter<T> {
    private Map<T, Integer> map = new HashMap<>();

    public void add(T key) {
        Integer v = map.get(key);
        if (v == null) {
            map.put(key, 1);
        } else {
            map.put(key, v + 1);
        }
    }

    public int get(T key) {
        Integer v = map.get(key);
        if (v == null) {
            return 0;
        } else {
            return v;
        }
    }

    public Set<T> keySet() {
        return map.keySet();
    }
}

Wie benutzt man

Main.java


    public static void main(String[] args) {
        int[] ary = { 1, 22, 22, 333, 333, 333, 9999, 8888 };
        Counter<Integer> c = new Counter<>();
        for (int v : ary) {
            c.add(v);
        }
        for (Integer i : c.keySet()) {
            System.out.println(i + ":cnt=" + c.get(i));
        }
    }

Wenn du rennst ...

1:cnt=1
22:cnt=2
8888:cnt=1
333:cnt=3
9999:cnt=1

Modifizierte Zählerklasse

(1/24 Postscript) Ich habe Informationen erhalten, dass eine Methode namens Map.getOrDefault aus JDK 1.8 hinzugefügt wurde, also habe ich sie neu geschrieben.

Counter.java


import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Counter<T> {
    private Map<T, Integer> map = new HashMap<>();

    public void add(T key) {
        int v = get(key);
        map.put(key, v + 1);
    }

    public int get(T key) {
        return map.getOrDefault(key, 0);
    }

    public Set<T> keySet() {
        return map.keySet();
    }
}

Wenn int v = map.get (key);, wenn es null war, war es null, sodass es keine andere Wahl gab, als es als Ganzzahl zu empfangen und zu beurteilen, aber es ist erfrischend, den Standardwert zurückgeben zu können. Das zweite Argument von getOrDefault, 0, wird zwischengespeichert, wenn eine Autobox an Integer gesendet wird.

Mit C ++

(1/21 postscript) In C ++ kann der primitive Typ in map angegeben werden, so dass es sehr einfach ist. Außerdem ist der Operator [] überlastet. Das ist schlau.

main.cpp


    std::map<int,int> c;
    c[ary[i]]++;

Mit Java

(1/21 postscript) Wenn es sich um Java handelt, ist es beim ersten Zugriff null, daher ist es unbedingt erforderlich, das erste und zweite Mal zu beurteilen. Ich habe darüber nachgedacht, eine Entry-Klasse in der inneren Klasse von Counter zu erstellen und int cnt zu haben. Wenn jedoch eine Instanz der Anzahl der Elemente in der Map erstellt wird und die Anzahl innerhalb von 127 liegt, ist sie effizienter als die von -128 bis 127 zwischengespeicherte Ganzzahl. Schlecht. Wenn jedoch für 128 oder mehr kein anderes entsprechendes Element vorhanden ist, werden 128 Instanzen erstellt, 129 Instanzen werden erstellt und 128 Instanzen unterliegen der GC. Dann frage ich mich, ob ich Integer verwenden werde, bis die Anzahl 127 beträgt, und den int-Wert meiner eigenen Entry-Klasse von 128 addieren werde. Ich denke nicht, dass es viel schneller sein wird, wenn Sie das tun. Booten Sie also die Option -XX: AutoBoxCacheMax → Ich habe die Quelle von Integer gelesen

Recommended Posts

Klasse zu zählen
Verwendung der Java-Klasse
[Ruby] Methode zum Zählen bestimmter Zeichen
So zerlegen Sie eine Java-Klassendatei
Kotlin-Klasse zum Senden an Java-Entwickler
Verwendung der Wrapper-Klasse
So dekompilieren Sie eine Java-Klassendatei
Verwendung von Klassenmethoden [Java]
to_ ○
[Java] Verwendung der Math-Klasse
Kotlins Klasse Teil 2 zum Senden an Java-Entwickler
[Java] Verwendung der File-Klasse
[Kotlin] Drei Möglichkeiten, um Klasse von KClass zu bekommen
Punkt 23: Bevorzugen Sie Klassenhierarchien gegenüber markierten Klassen
Rubinlänge, -größe, -anzahl Verwendung
So definieren Sie eine Bean der inneren Klasse
[Verarbeitung × Java] Verwendung der Klasse
Verwendung der Java Scanner-Klasse (Hinweis)
Anonyme Klasse (mit dem Ziel, Stream-API einzuführen)
[Java] Verwendung der Calendar-Klasse
So zählen Sie UTF-8-Codepunkte schnell