[JAVA] Classe à prendre en compte

Lorsque vous résolvez le problème, vous pouvez obtenir un décompte.

Utiliser un tableau

Lorsque la valeur maximale est connue et peut être sécurisée dans le tableau.

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]);
            }
        }
    }

Quand tu cours ...

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

Classe de compteur qui utilise HashMap

Utilisez HashMap si vous ne connaissez pas la valeur maximale ou si elle est trop grande pour être réservée dans un tableau. Bien entendu, le nombre d'inscriptions doit tenir dans la mémoire.

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();
    }
}

Comment utiliser

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));
        }
    }

Quand tu cours ...

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

Classe de compteur modifiée

(1/24 postscript) J'ai appris qu'une méthode appelée Map.getOrDefault avait été ajoutée à partir du JDK 1.8, je l'ai donc réécrite.

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();
    }
}

Auparavant, si int v = map.get (key);, il serait nul s'il était nul, il n'y avait donc pas d'autre choix que de le recevoir comme un entier et de le juger, mais il est rafraîchissant de pouvoir renvoyer la valeur par défaut. Le deuxième argument de getOrDefault, 0, est mis en cache lorsqu'il est automatiquement converti en Integer.

Avec C ++

(1/21 postscript) En C ++, le type primitif peut être spécifié dans map, donc c'est super facile. De plus, l'opérateur [] est surchargé. C'est sournois.

main.cpp


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

Avec java

(1/21 postscript) S'il s'agit de java, il sera nul lors du premier accès, il est donc absolument nécessaire de juger les première et deuxième fois. J'ai pensé à créer une classe Entry dans la classe interne de Counter et à avoir int cnt;, mais si une instance du nombre d'éléments dans la carte est créée et que le nombre est inférieur à 127, il est plus efficace que Integer mis en cache de -128 à 127. mal. Cependant, pour 128 ou plus, s'il n'y a pas d'autre élément correspondant, 128 instances sont créées, 129 instances sont créées et 128 instances sont soumises à GC. Ensuite, je me demande si j'utiliserai Integer jusqu'à ce que le nombre soit de 127 et ajouter la valeur int de ma propre classe Entry à partir de 128. Je ne pense pas que ce sera beaucoup plus rapide si vous faites cela. Donc option de démarrage -XX: AutoBoxCacheMax → J'ai lu la source de Integer

Recommended Posts

Classe à prendre en compte
Comment utiliser la classe Java
[Ruby] Méthode pour compter des caractères spécifiques
Comment désassembler un fichier de classe Java
Classe Kotlin à envoyer aux développeurs Java
Comment utiliser la classe wrapper
Comment décompiler un fichier de classe Java
Comment utiliser les méthodes de classe [Java]
à_ ○
[Java] Comment utiliser la classe Math
Kotlin's Class part.2 à envoyer aux développeurs Java
[Java] Comment utiliser la classe File
[Kotlin] Trois façons d'obtenir un cours depuis KClass
Élément 23: Préférez les hiérarchies de classes aux classes balisées
Longueur, taille, nombre de rubis Comment utiliser
Comment définir un bean de classe interne
[Traitement × Java] Comment utiliser la classe
Comment utiliser la classe Java Scanner (Remarque)
Classe anonyme (visant à introduire l'API de flux)
[Java] Comment utiliser la classe Calendar
Comment compter rapidement les points de code UTF-8