code so schreiben das er von sich selber anpasst (code soll die anzahl aller bustaben bestimmen)

triade

Aktives Mitglied
Hallo,
habe einen code geschrieben der einen sagt wie viele Wörter der eigegebene Text beinhaltet. ich hatte die Idee das der Code noch die Anzahl der einzelnen Bustaben bestimmt. Der code an sich ist ja nicht schwer, dieser ist ja genau so wie der bei der anzahl der wörter wo man die Leerzeichen bestimmt +1.

Hier als Bsp. für den bustaben b:
Java:
int b=0;
        for (int i=0;i<ne.length();i++)
        {
            if(ne.charAt(i) == 'b')
            {
                b++;
            }
        }
        System.out.println(b);

Was meine frage allerdings ist, ist es möglich den code so zu schreiben das er von sich aus von allen Bustaben das bestimmt und ich den codeabschnitt oben nicht 26 mal schreiben muss. Damit der Code nicht so unnötig überfüllt ist. Und weiß wer ob dies in einer separaten Methode machbar wäre allerdings so das die main Methode darauf zurückgreifen kann und auf die Benutzer Eingabe bestimmt die anzahl der vom nutzer gewollten Bustaben ausgibt?

Z.b der Nutzer möchte die anzahln des Bustaben t und der code greift in der zusätzlichen Methode daruaf und antwortet das dieser Bustabe so und so oft vorkommt.


(Zudem bitte ich um Entschuldigung das die frage so schlecht sage ich mal gestellt ist allerdinsg weiß ich nie wie ich eine passende frage vormulieren kann)
 
Bei so Anforderungen muss man sich eine Datenstruktur überlegen, die man verwenden möchte / könnte. Üblich sind hier z.B.:

a) Arrays / Listen: Da hast Du dann für die 26 Buchstaben halt ein Array oder eine Liste mit 26 Elementen. Die Anzahl der Vorkommen eines Buchstaben sind also in so einem Array oder Liste. Und dann musst Du nur noch von einem Zeichen zu dem index kommen. Das kann bei einem Buchstaben sein, dass Du vom Buchstabencode einfach 'a' abziehst. Dann wäre a -> 0, b -> 1, ...

b) Maps - bei Maps hast Du key/value Paare. Dann kannst Du also in der Map den Buchstaben als Key und die Anzahl als Wert ablegen. Damit könntest Du dann über den Buchstaben direkt auf die Anzahl zugreifen.

Das einfach nur, um Dir zwei mögliche Ansätze aufzuzeigen, die Du nutzen könntest. Generell sollte man sich also sehr gut mit der Collections API von Java vertraut machen, damit man die Möglichkeiten kennt, die das Framework einem gibt und auch die Unterschiede zwischen den einzelnen Klassen versteht um eine sinnvolle Implementation zu wählen.

Eine erste Übersicht von Oracle zu Java 7 wäre z.B. Collections (Java Platform SE 7 ) (oracle.com)
 
Ich finde man kann gar nicht früh genug anfangen so zu programmieren das das Ergebnis leicht skalierbar ist, demnach erachte ich Vorschlag B von Konrad als deutlich effizienter.

Nur mal angenommen das Programm wird ein Riesenerfolg und soll weltweit ausgerollt werden, dann stößt man mit diesem "Zeichen auf Index umwandeln" bei Lösung A schnell an seine Grenzen wenn dann die ganzen länderspezifischen Sonderzeichen dazu kommen (wir mit unseren ä,ü,ö und ß, die Franzosen mit Ihren Strichen etc ...)

Demnach einfach eine Map nutzen mit einer Char als Key und einem Integer als Wert. Bei jedem Buchstaben dann abfragen ob der Key schon existiert. Wenn ja dann den zugehörigen Integer Wert inkrementieren, wenn nein dann einen neuen Schlüssel anlegen mit Integer Wert von 1.
 
Ich finde man kann gar nicht früh genug anfangen so zu programmieren das das Ergebnis leicht skalierbar ist, demnach erachte ich Vorschlag B von Konrad als deutlich effizienter.

Ja, aber eher Nein. Man sollte so programmieren dass eine brauchbare, angemessene Loesung dabei herauskommt. Das ist nicht immer die Loesung die am leichtesten skaliert. Zum Beispiel auf die Frage "Wie fuehre ich eine Java Applikation auf meinem Desktop aus?" zu antworten "Ein Docker-Image gestartet ueber einen Kubernetes-Dienst ist ganz einfach" dann ist dass die Loesung die am besten skaliert, aber dann doch die Frage nach offenen Hinterteilen aufkommen laesst.

Aehnlich verhaelt es sich hier, wenn du schon mit char statt int arbeitest kannst du genauso gut ein Array fuer alle moeglichen char-Werte anlegen, das ist dann ein 65k Array und das spielt leistungstechnisch keinerlei Rolle, auf keiner Maschine. Da koennte sogar die Map das teurere sein wenn es um die Rechenzeit geht. Anders verhaelt es sich natuerlich wenn du den ganzen UTF-8 Bereich abdecken willst, ein Array mit 4 Milliarden moeglichen Werten ist da schon etwas gruseliger (nicht zuletzt weil Java derart grosze Arrays nicht kann, man muesste es aufteilen oder den "neuen" Support fuer grosze Arrays verwenden, von dem habe ich aber nur gehoert).

Und um dann doch noch meinem Drang nachzugeben (welchen ich beim ersten sehen vom Thema unterdrueckt hatte): Hier meine Wiederholung zu Boxing/Autoboxing.
 
Man sollte so programmieren dass eine brauchbare, angemessene Loesung dabei herauskommt.
Das ist der ganz große, wichtige Punkt. Man muss also die Anforderungen analysieren und dann eine brauchbare Lösung auswählen. Und was man dann wirklich braucht und was brauchbar ist, muss man dann sehen. Daher waren das auch nur zwei Beispiele, was man machen könnte und man sollte generell die Möglichkeiten kennen. Der Hinweis zu den Collections gab es ja schon, aber das ist nur eine kleine Basis.

Wichtiger als irgendwelche Optimierungen sind aus meiner Sicht erst einmal, das ein lesbarer Code entsteht. (Klar, Code sollte vernünftig geschrieben sein um z.B. unnötigen Aufwand zu vermeiden, aber wenn es nur um die 26 Zeichen geht, dann würde ich bezüglich Array und Map gar nicht erst evaluieren wollen, was besser ist.

Nur mal angenommen das Programm wird ein Riesenerfolg und soll weltweit ausgerollt werden, dann stößt man mit diesem "Zeichen auf Index umwandeln" bei Lösung A schnell an seine Grenzen wenn dann die ganzen länderspezifischen Sonderzeichen dazu kommen (wir mit unseren ä,ü,ö und ß, die Franzosen mit Ihren Strichen etc ...)
Dann ist aber evtl. auch die Map Lösung schlecht. Wenn ich die Anzahl der möglichen UTF Zeichen betrachte, dann kann das kritisch werden. Dann sind evtl. Lösungen notwendig, die Daten nicht im Hauptspeicher halten. Dann bleiben nur zuletzt verwendete Elemente im Cache. (Dann hat man z.B. eine Datenbanklösung). Also auch wenn ich hier auf Collections im Java Framework verwiesen habe: Das ist nur ein eigentlich kleiner Teil an Möglichkeiten - auch wenn man damit sehr viel abdecken kann.
 
Hallo, ich habe es mit Arrays gelöst allerdings fehlt noch eine Sache zum endgültigen Code, und zwar das der Nutzer bestimmt welche Anzahl von welchem Bustaben ihn angezeigt wird. Hätte jemand eine idee wie das aussehen könnte?
Code bis jz:
Java:
import java.util.Scanner;

public class WoerterAnzahl
{
     public static void main (String [] args)
    {
        woerterausrechnen();
    }
    public static void woerterausrechnen()
    {

        System.out.println("Hallo ich sage Ihnen wie viele Wörter Ihr Text Beinhaltet geben Sie diesen einfach ein.");
        Scanner zeta = new Scanner(System.in);
        String ne = zeta.nextLine();
        int leerz = 0;
        int woe=0;
        for (int i=0;i<ne.length();i++)
        {
            if(ne.charAt(i) == ' ')
            {
                leerz++;
            }
            
        }
        woe=leerz+1;
        System.out.println("Ihr Text hat " + woe + " Wörter.");



        // Bustaben
      

        int[] bust = new int[26];
        for (int h = 0; h < 26; h++)
        {
        bust[h] = 0;
        }

        char[]  bustaben = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
        char[]  bg = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
        
        for(int i=0;i<ne.length(); i++)
        {
            for(int j=0;j<26;j++)
            {
                
                if(ne.charAt(i) == bustaben[j]||ne.charAt(i) == bg[j])
                {
                      bust[j]++;
                }
            
            }
        }
        System.out.println(bust[0]);
    }
}
 
Darüber solltest du noch mal ganz besonders nachdenken:
Java:
        int[] bust = new int[26];
        for (int h = 0; h < 26; h++)
        {
        bust[h] = 0;
        }
 
Darüber solltest du noch mal ganz besonders nachdenken:
Java:
        int[] bust = new int[26];
        for (int h = 0; h < 26; h++)
        {
        bust[h] = 0;
        }
Meinst du man kann es besser machen das alle 26 werte auf 0 gesetzt werden?
Und der Grund warum ich es eben mit Arrays statt mit einer Map gemacht habe ist der das ich morgen ne Arbeit über Arryas und Schleifen usw. schreibe und deshalb die Sachen die ich gerade schreibe darauf ausrichte ob es damit geht damit ich das besser Lerne. Zudem hatte ich Maps in der Schule noch garnet (möchte diese zwar lernen, ohne frage, allerdings schreibe ich eben so kleinere Projekte die an meinen Lehrer gehen als so zusätzliches für die Sonstige Leistung und da ist es eben besser wenn ich das verwende was wir im Unterricht nutzen.).
 
Die Größe eines int-Wertes liegt bei 32 Bit. Er umfasst einen Wertebereich von dezimal -2147483648 (-2^31) bis 2147483647 (2^31 -1). int ist kein Object daher kann int nicht null (oder nichts) sein und muss vor der ersten Verwendung initialisiert werden. Das gilt auch wenn int Bestandteil eines Arrays ist. Also ist:
Java:
int[] bust = new int[26];
automatisch ein Array welches 26 mal 0 enthält.
 
Zuletzt bearbeitet:
Da steht wenn ich mich nicht irre nicht was allerdings als 0 gewertet wird . 🙂
Die Größe eines int-Wertes liegt bei 32 Bit. Er umfasst einen Wertebereich von dezimal -2147483648 (-2^31) bis 2147483647 (2^31 -1). int ist kein Object daher kann int nicht null (oder nichts) sein und muss vor der ersten Verwendung initialisiert werden. Das gilt auch wenn int Bestandteil eines Arrays ist. Also ist:
Java:
int[] bust = new int[26];
automatisch ein Array welches 26 mal 0 enthält.
Okay vielen Dank 🙏 Aber hättest du ne Idee wie ich es mit dem Aussuchen vom Nutzer machen kann? Denn jetzt mit 26 If‘s zu kommen ist schon nervig. Zudem würde Ich es gerne so machen das der Nutzer einfach von somvielen bustaben wie es möchte die Anzahl angezeigt bekommt. Wieich dies machen kann ist mir auch noch fremd und habe auch dazu eben keine Idee.
 
Aber hättest du ne Idee wie ich es mit dem Aussuchen vom Nutzer machen kann?
Dann schau doch mal in die ASCII-Tabelle rein. a ist dezimal 97 und z ist dezimal 122. Das ist doch super! Das Array int[] bust = new int[26]; begint mit dem Index 0 also 'a' - 'a' = 0 --> bust[0] ist der Wert den du brauchst. 'b' - 'a' = 1 --> bust[1] ... usw.
Also lasse den Nutzer einen Buchstaben eingeben und ziehe 97(a) ab, wenn es ein Kleinbuchstabe ist. Wenn die Eingabe kleiner als 'a' ist, dann ist es ein Großbuchstabe, dann einfach -'A'.
 

Neue Themen


Zurück
Oben