Lorsque vous résolvez le problème, vous pouvez obtenir un décompte.
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
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
(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.
(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]]++;
(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