Zeichenkette in Java?

... komplette Frage anzeigen

5 Antworten

Wenn du schon sowas wie HashMap oder TreeMap kennst, kannst du es damit machen.

Oder du initialisierst ein ausreichend großes Integer-Array (mind 128 wenn Umlaute etc. ausgeschlossen werden können), gehst das char-Array zeichenweise durch und erhöhst jeweils die entsprechende Stelle im Array. Dann sind zwar hinterher die meisten Plätze leer, aber das dürfte die schnellste Lösung sein (wenn Speicherplatz keine Rolle spielt).

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von TeeTier
21.05.2016, 13:34

(wenn Speicherplatz keine Rolle spielt)

Also selbst wenn wir beachten dass Java selbst auf 64 Bit Systemen viele Zeiger intern in 4 Byte packt, wird die Variante mit einer HashMap schon ab mindestens 30 verschiedenen Zeichen mehr Speicherplatz benötigen.

Wenn sich die Anwendung also nicht ausschließlich mit kurzen Wörtern befasst, wird der Ansatz mit dem Array nicht nur im Hinblick auf Geschwindigkeit der effizientere sein. :)

0

Mein Ansatz ist folgender:

Erstelle ein HashTable, in dem du als Key jeden vorkommenden Buchstaben einmal und als Value vorerst 0 einspeicherst.
Dann gehst du das Char-Array durch und suchst bei jedem Buchstaben den jeweiligen Index in der HashTable und erhöhst den Key um 1.

Nachher kannst du dann jeden Indize der HashTable ausgegeben.

Ich hoffe, ich konnte dir helfen; wenn du noch Fragen hast, kommentiere einfach.

LG Willibergi

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von naoommii
21.05.2016, 12:01

Danke aber würdest du dann alles mit einer for schleife durchgehen ? 

0
Kommentar von Willibergi
21.05.2016, 12:02

Ja, das wäre schlau. ;)

LG Willibergi

1
Kommentar von Willibergi
23.05.2016, 12:14

Wofür die Downvotes?

LG Willibergi

0

Ich persönlich würde hier eine Map verwenden, welche als Schlüssel die Character-Klasse entgegen nimmt und als wert die Integer-Klasse.

Beim durchlaufen deiner Char-Array prüfst du dann ob du den Schlüssel schon deiner Map hast:

Wenn nicht, fügst du den Wert hinzu, dabei wäre der Schlüssel der char wert und 1 der Wert, den du anfügst (1 = aktueller wert wurde 1x gefunden)

Hast du einen Eintrag bereits in deiner Map, so holst du dir den Wert und addierst ihn mit 1 und schreibst ihn zurück.

Bei der Ausgabe kannst du einfach das entrySet durchlaufen und entsprechend eine Ausgabe tätigen, z.b. so:

for (Map.Entry<Character, Integer>  entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue() );
}

Welche Map du nun konkret verwenden sollst, hängt von der Aufgabenstellung ab. Eine Treemap würde beispielsweise den Schlüssel sortieren. Eine Hashmap wäre unsortiert.

Antwort bewerten Vielen Dank für Deine Bewertung

Ich bin etwas erschrocken, dass die bisherigen Antworten hier ausschließlich auf eine HashMap hinweisen.

Edit: Der User "Schachpapa" hat während dem Verfassen meiner Antwort darauf hingewiesen! :)

Da es hier um ASCII geht, ist ein einfaches Array mindestens genauso sauber und gefühlt eine Million mal effizienter als eine HashMap.

Beispiel:

public static void charStats(final String ascii) {
int[] stats = new int[1 + Byte.MAX_VALUE];

final char[] chars = ascii.toCharArray();
for (char c : chars) {
++stats[c];
}

System.out.format("\\"%s\\":\\n", ascii);
for (char c = 0; c <= Byte.MAX_VALUE; ++c) {
if (0 < stats[c]) {
System.out.format("'%c' x %d\\n", c, stats[c]);
}
}
}

Bitte beachte hierbei, dass du bei Nicht-ASCII-Zeichen eine Exception um die Ohren gehauen bekommst, was dir bei einer HashMap nicht passieren wird. Da deine Anforderung aber explizit auf ASCII besteht, ist so eine Ausnahme dann natürlich absolut erwünscht!

Der Sauberkeit halber sollte man die beiden Hauptteile (Zählen und Ausgabe) in zwei Funktionen auslagern, aber es sind ja schließlich nur deine Hausaufgaben, also was solls. ;)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von naoommii
21.05.2016, 14:18

Dankeschön :)

0
Kommentar von KnusperPudding
21.05.2016, 14:29

Ich weiß ehrlich gesagt nicht so ganz, was dich daran schockiert.

Deine Lösung ist definitiv Speicher-Freundlicher, jedoch sind die Tipps mit den Maps für Anfänger leichter zu verstehen.

Man sammelt in einer Map die einzelnen Zeichen und zählt diese entsprechend hoch.

private static void charCounter(final String value) {
Map<Character, Integer> map = new HashMap<>();

char[] chars = value.toCharArray();
for (char ch : chars) {
if (map.containsKey(ch)) {
map.put(ch, map.get(ch) + 1);
} else {
map.put(ch, 1);
}
} for (Map.Entry<Character, Integer> entry : map.entrySet()) { System.out.format("%c : %d\n", entry.getKey(), entry.getValue()); } }

Deine saubere Lösung in allen Ehren, aber dass das so schockierend sein, kommt nicht unbedingt freundlich an...

1

Der Eigene Ansatz ist ganz schon Vage.

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?