Wenn Sie das Problem lösen, erhalten Sie möglicherweise eine Zählung.
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
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
(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.
(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]]++;
(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