Zeichenkettenanalyse.zeichenZaehlen

zesa

Mitglied
Hallo Zusammen,

ich hoffe ihr könnt mir hier helfen.
ich habe mehrere Aufgaben zu erfüllen:

Ich soll eine Methode:
Code:
public static int[] vokaleZaehlen (String zeichenkette)
schreiben.
Soweit so gut.
Übergeben werden soll sowas wie
Code:
Zeichenkettenanalyse.zeichenZaehlen("Zaehle die Vokale");

Es soll dann entsprechend ein Array in der Reihenfolgende der Vokabeln rauskommen:
z.B.
Code:
int[] result = {2,4,1,1,0}

Nun habe ich erstmal folgendes geschrieben:
Code:
System.out.println("1. Vokale zählen");
Scanner sc1 = new Scanner(System.in);
System.out.print("Zu analysierende Zeichenkette: ");
String v1 = sc1.nextLine();
System.out.println("Anzahl des Buchstabens: "+Zeichenkettenanalyse.vokaleZaehlen(v1));

Soweit so gut.
Nun die Methode, ich weiß die sieht etwas umständlich aus, ich wollte es aber so, um mir es übersichtlicher zu gestalten und zu verstehen.

Das Problem ist, wenn ich das so ausführe, bekomme ich den Array Speicherplatz (also sowas wie [I@a4a63d8) zurück.
Mache ich das mit toString und steuer z.B. result[0] an, bekomme ich die Zeichenkette 1:1 zurück.

Was mache ich falsch?
Wieso ist das so =(

????

Danke Euch, Zesa

Code:
public static int[] vokaleZaehlen (String zeichenkette) {
		result = new int[5];
		a = 0;
		e = 0;
		i = 0;
		o = 0;
		u = 0;
		for (int j=0; j < result.length; j++){
	        for(char c: zeichenkette.toCharArray()){ 
	        	if (c=='a'){
	        		a++;
	        	}
	        	if (c=='e'){
	        		e++;
	        	}
	        	if (c=='i'){
	        		i++;
	        	}
	        	if (c=='o'){
	        		o++;
	        	}
	        	if (c=='u'){
	        		u++;
	        	}
	       }
	        }
		result[0]=a;
		result[1]=e;
		result[2]=i;
		result[3]=o;
		result[4]=u;
		return result;
	 }
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Du hast da eine Statische methode , wo genau deklarierst du denn
die variable result ? außerhalb ? bzw. den Typ.
Java:
result = new int[5];

wenn result ein int array ist musst du auch dieses in der statischen Methode deklarieren , ein wunder das die IDE nicht meckert.
Java:
char[] vokale = {'a','e','i','o','u'};

int[] result = new int[vokale.length];


mal davon abgesehen iterierst du hier doch 5 mal über das Array da du das hier aber nur einmal machen möchtest wäre eigentlich doch

sprich deine normale for-schleife ist fehl am Platz

Java:
public class Foo {
	
	public static int[] vokaleZaehlen(String zeichenkette){
		
		char[] vokale = {'a','e','i','o','u'};
		
		int[] result = new int[vokale.length];
	
	        for (char c : zeichenkette.toCharArray()) {
	            if (c == vokale[0]) {
	                result[0]++;
                }
	            if (c == vokale[1]) {
	                result[1]++;
                }
	            if (c == vokale[2]) {
	                result[2]++;
                }
	            if (c == vokale[3]) {
	                result[3]++;
                }
	            if (c == vokale[4]) {
	                result[4]++;
                }
            }
		return result;
	}
	
	public static void main(String[] args) {
	   int[] result = Foo.vokaleZaehlen("aeiouaaaaffffrrrreeeeiii");
	   
	   for (int i : result) {
	    System.out.println(i);
	   }
    }
}

korrekt.

Die Ausgabe wäre dann :

Code:
5
5
4
1
1
 
Zuletzt bearbeitet:

zesa

Mitglied
Okay, mit einer Schleife bekomme ich das ganze dann auch hin =)

Danke erstmal, jetzt mache ich mich mal dran, wie ich weiter machen muss, wenn es keine Vokale sind und ich die Zeichen via Eingebe eingeben muss.


Java:
public static int[] vokaleZaehlen (String zeichenkette) {
		 char[] vokale = {'a','e','i','o','u'};
		 int[] result = new int[vokale.length];
	     for ( int i = 0; i < vokale.length; i++ ) {
		 for (char c : zeichenkette.toCharArray()) {
             if (c == vokale[i]) {
                 result[i]++;
             }
		 }
		 System.out.print(result[i]);
	     }
     return result;    
	 }
 
Zuletzt bearbeitet:

zesa

Mitglied
Okay letzte Frage: =)

Nun möchte ich gerne die Zeichenkette und die Buchstaben an meine Klasse "Zeichenkettenanalyse" übermitteln.

Mit Hilfe der Vokabelaufaufgabe von oben, habe ich den Teil (glaube ich zumindest) gelöst.
Ich vermute es liegt an der Eingabe der Buchstaben, was tue ich hier falsch?


Java:
Scanner sc3 = new Scanner(System.in);
    		System.out.print("Zu analysierende Zeichenkette: ");
    		String t3 = sc3.nextLine();
    		System.out.print("Welcher Buchstabe(n) soll(en) hier gesucht werden:");
    		String t4 = sc3.nextLine();
    		for (int i = 0; i < t4.length(); i++) {
    			c2[i] = t4.charAt(i);
    		}
    		Zeichenkettenanalyse.zeichenZaehlen(t3,c2);


Hier der Abschnitt aus der Klasse Zeichenkettenanalyse:

Java:
 public static int[] zeichenZaehlen(String zeichenkette, char[] zeichenArray){
		 char[] zeichenArray1 = zeichenArray ;
		 int[] result = new int[zeichenArray1.length];
	     for ( int i = 0; i < zeichenArray1.length; i++ ) {
		 for (char c : zeichenkette.toCharArray()) {
             if (c == zeichenArray1[i]) {
                 result[i]++;
             }
		 }
		 System.out.println("Anzahl des Zeichens "+zeichenArray1[i]+ " : "+ result[i]);
	     }
     return result;    
	 }




Die Fehlermeldung:
Code:
Exception in thread "main" java.lang.NullPointerException
	at ZeichenkettenanalyseTest.main(ZeichenkettenanalyseTest.java:47)
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Die Eingabe in der Konsole kannst du mit einem Scanner realisieren , sollen die Zeichen die keine Vokale sind denn auch gezählt werden ?

Hier nochmal ein etwas abgewandeltes Beispiel, allerdings musst du auch noch bedenken das bei dem Übergeben String noch zwischen Groß und kleinschreibung unterschieden wird ein großen 'A' wird z.B nicht gezählt ! hier musst du den String dann erstmal mit
Code:
String.toLowerCase();
in lowercase umwandeln und dann als char Array nutzen.

Zusätzlich habe ich eine Methode geschrieben welche mir die Ergebnisse dann direkt in der Konsole ausgibt:

Java:
import java.util.Scanner;

public class Foo {
	
	static int[] results = {0,0,0,0,0};
	static char[] vokale = {'a','e','i','o','u'};
    
    public static void vokaleZaehlen(String zeichenkette){
    	
        char[] vokale = {'a','e','i','o','u'};
    
            for (char c : zeichenkette.toCharArray()) {
                if (c == vokale[0]) {
                    results[0]++;
                }
                if (c == vokale[1]) {
                    results[1]++;
                }
                if (c == vokale[2]) {
                    results[2]++;
                }
                if (c == vokale[3]) {
                    results[3]++;
                }
                if (c == vokale[4]) {
                    results[4]++;
                }
            }
    }
    
    public static void printResults(){
    	StringBuilder builder = new StringBuilder();

    	for (int i = 0; i < results.length; i++) {
	        System.out.print("Anzahl an " + vokale[i] + " : " + results[i]  + System.getProperty("line.separator"));
        }
    	System.out.println(builder.toString());	
    }
    
    public static void main(String[] args) {
    	
    	Scanner sc = new Scanner(System.in);
    	
    	Foo.vokaleZaehlen(sc.nextLine());
    	Foo.printResults();
    	
    	sc.close();
    }
}

Bei Eingabe des Literals "Eingabe" kommt man dann zu folgender Ausgabe :

Code:
Eingabe
Anzahl an a : 1
Anzahl an e : 2
Anzahl an i : 1
Anzahl an o : 0
Anzahl an u : 0

[EDIT]Da du grade schneller warst schau dir erstmal meinen Post an :)[/EDIT]
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Code:
Exception in thread "main" java.lang.NullPointerException
	at ZeichenkettenanalyseTest.main(ZeichenkettenanalyseTest.java:47)

Dazu müsste ich die ganze Klasse oder zumindest zeile 47 sehen, außerdem hast du in deiner Methode immernoch eine verschachtelte for-Schleife dirnn.....

Die Frage ist außerdem was genau du erreichen möchtest , möchtest du alle Buchstaben zählen können ? das folgt das dem gleichen prinzip.

implementiere in dieser Utility klasse eine folgende methode ,

Java:
    public static void buchstabenZeahlen(String zeichenkette, char...zeichen){
    	//..
    }

in dieser kannst du dann auch einfach die statische Methode zum vokale Zählen aufrufen

Java:
 public static void buchstabenZeahlen(String zeichenkette, char...zeichen){
    	vokaleZaehlen(zeichenkette);

//...much more code
    }
 
Zuletzt bearbeitet:

zesa

Mitglied
die verschachtelte for schleife habe ich deshalb, weil ich so so abhängig von der länge des Arrays die Daten ausspucke.
Da es eh Vokale sind und diese natürlich fest sind, ist es klar, ich wollte es aber so "hübscher" machen,
besonders auch wegen der nächsten Aufgabe, wenn ich bestimmte Buchstaben übermitteln möchte.


Der Fehler mit der Zeile 47 bezieht sich hier auf:
Java:
                c2[i] = t4.charAt(i);

Diese Methode soll am Ende "unabhängig von den Vokalen" ein Wort / oder ein Satz und ein Array mit Chars bekommen.
Ich habe hierzu einfach das mit den Vokabeln genommen und entsprechend etwas geändert.

wie oben beschrieben.
Das scheint auch zu laufen.

Probleme tauchen auch mit
Java:
                c2[i] = t4.charAt(i);

und ich bin mir nicht sicher, wie ich diese Chars richtig übergebe.
Java:
    		Zeichenkettenanalyse.zeichenZaehlen(t3,c2);
???

Wenn ich das char manuell übergebe, also
Java:
Zeichenkettenanalyse.zeichenZaehlen(t3,'c');
und danach dann starte, passiert nichts. also ich bekomme keine Fehlermeldung, aber auch keine Ausgabe.

!?! bin ratlos ?! =/
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Chars werden so übergeben
Code:
'c'
du musst insofern die Methode einen rückgabewert haben sollte diese auch mit einem Ausgabestream umschließen

Java:
System.out.printl(Zeichenkettenanalyse.zeichenZaehlen(new String("Hallo").toCharArray(), 'l'));
 

kaoZ

Top Contributor
Ich würde ja eine Methode zum zählen der einzelnen Buchstaben folgendermaßen implementieren

Java:
public class Zeichenkettenanalyse {
	
	static char [] token =
		{
			'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'
		};
						
	
	public static int[] countLetters(String zeichenkette){
		
		int results[] = new int[26];
		
		char[] chars = zeichenkette.toLowerCase().toCharArray();

		
		
		for (int i = 0; i < chars.length; i++) {
	        for (int j = 0; j < token.length; j++) {
	            if (chars[i] == token[j]) {
	                System.out.println(chars[i] + " " + j);
	                results[j]++;
                }
            }
        }
		return results;
	}
	
	public static void print(int[] chars){
		for (int i = 0; i < chars.length; i++) {
	        System.out.println("Anzahl " + token[i] + " : " + chars[i]);
        }
	}
	
	public static void main(String[] args) {
	    Zeichenkettenanalyse.print(Zeichenkettenanalyse.countLetters("Hallo"));
    }
}

Und hier die Ausgabe dazu :

Code:
Anzahl a : 1
Anzahl b : 0
Anzahl c : 0
Anzahl d : 0
Anzahl e : 0
Anzahl f : 0
Anzahl g : 0
Anzahl h : 1
Anzahl i : 0
Anzahl j : 0
Anzahl k : 0
Anzahl l : 2
Anzahl m : 0
Anzahl n : 0
Anzahl o : 1
Anzahl p : 0
Anzahl q : 0
Anzahl r : 0
Anzahl s : 0
Anzahl t : 0
Anzahl u : 0
Anzahl v : 0
Anzahl w : 0
Anzahl x : 0
Anzahl y : 0
Anzahl z : 0

nun kannst du auch nach dem Muster auch einfach eine statische methode anbieten die nur ein ausgewählten Buchstaben sucht undzählt
 

kaoZ

Top Contributor
So könnte dann eine Methode zum zählen eines bestimmten buchstabens aussehen :

Java:
	public static int countSingleLetter(String zeichenkette, char letter){
		
		int result = 0;
		
		char[] token = zeichenkette.toLowerCase().toCharArray();
		
		for (char c : token) {
	        if(c == letter){
	        	result++;;
	        }
        }
		return result;
	}

und die Ausgabe bei folgender ausführung:

Java:
System.out.println(Zeichenkettenanalyse.countSingleLetter("Test", 't'));

Code:
2


[EDIT]
Darf man eigentlich fragen warum du nicht mit der Wrapperklasse
Code:
Character
arbeitest und dann die einzelnen chars per
Code:
.equals(Object o);
vergleichst ?
[/EDIT]
 
Zuletzt bearbeitet:

zesa

Mitglied
Ich danke Euch allen,
Die Ansätze helfen mir schon.

Das Problem ist, dass ich kein char sondern ein chararray übermittelt bekomme, das macht mir das Problem.
Sonst wäre es ja etwas einfacher.

Die Aufgabe wurde so vorgegeben. Mit equals habe ich noch nie gearbeitet. :-/
Der Methodenkopf ist so vorgegeben, der Rest muss kommen.

Außerdem ist mein Problem auch, dass ich mir nicht sicher bin, ob ich von meiner Testklasse richtig in die Klasse mit dem Code komme, zumindest meckert Eclipse nicht.

Laut Aufgabenstellung könnte ich auch so die Daten zur Methoden übermitteln:
Java:
Zeichenkettenanalyse.zeichenZaehlen2("Lustig",{'z', 'i', 'n'});

Dann meckert aber Eclipse und schlägt mir vor eine andere Methode zu bauen:
Java:
	public static void zeichenZaehlen2(String t3, char c, char d, char e)
Eventuell scheint die Aufgabenstellung nicht korrekt zu sein, da es dann einfach mehrere Char sind, aber kein Chararray.???

hier mal nun der komplette Code von Zeichenkettenanalyse.java
Java:
public class Zeichenkettenanalyse {
 
	 public static int[] zeichenZaehlen2(String zeichenkette, char[] zeichenArray){
		 char[] zeichenArray1 = zeichenArray;
		 int[] result = new int[zeichenArray1.length];
	     for ( int i = 0; i < zeichenArray1.length; i++ ) {
		 for (char c : zeichenkette.toCharArray()) {
             if (c == zeichenArray1[i]) {
                 result[i]++;
             }
		 }
		 System.out.println("Anzahl des Zeichens "+zeichenArray1[i]+ " : "+ result[i]);
	     }
     return result;    
	 }	 
}


Und hier mein Code zu ZeichenkettenanalyseTest.java, um die Methode aufzurufen und den String sowie das Array weiterzugeben:
Java:
import java.util.Scanner;
public class ZeichenkettenanalyseTest {
    public static char[] c2;

	public static void main(String[] args) {
    		Scanner sc3 = new Scanner(System.in);
    		System.out.print("Zu analysierende Zeichenkette: ");
    		String t3 = sc3.nextLine();
    		System.out.print("Welcher Buchstabe(n) soll(en) hier gesucht werden:");
    		String t4 = sc3.nextLine();
    		for (int i = 0; i < t4.length(); i++) {
    			c2[i] = t4.charAt(i);
    		}
    		Zeichenkettenanalyse.zeichenZaehlen2(t3,c2);
    }
}


Das ist das was dann bei der Ausgabe kommt:
Code:
Zu analysierende Zeichenkette: Lustig
Welcher Buchstabe(n) soll(en) hier gesucht werden:u
Exception in thread "main" java.lang.NullPointerException
	at ZeichenkettenanalyseTest.main(ZeichenkettenanalyseTest.java:14)
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Java:
Zeichenkettenanalyse.zeichenZaehlen2("Lustig",{'z', 'i', 'n'});

Das kannst du mit Varargs realisieren, den rest schau ich mir an wenn ich zeitlich dazu komme

Varargs Syntax: ( Variabel lange Argumentenliste)

Beachte, das die Varargsanweisung immer der letze Parameter sein muss !

Java:
public static void zeichenZaehlen(String zeichenkette, char...chars){...}

Der Compiler macht daraus dann ein char Array, oder du kannst wahlweise auch eins übergeben

also entweder :

Java:
ZeichenAnalyse.zeichenZaehlen("Test", 'i','o');

// oder

char[] arr = {'o','u'};

ZeicheAnalyse.zeicheZaehlen("Test", arr);

Zu den vergleichen, du solltest dir einfach die logik vor Augen halten, welche notwendig ist um dies zu realisieren,

du hast einen String, welchen du zuerstmal in kleinbuchstaben konvertieren solltest, denn

Code:
 "H" != "h

dann hast du ein char array, welches einzelne Buchstaben enthält die in deinem String gesucht werden sollen, also gibt es nun mehrere Möglichkeiten, du legst dir in Referenzarray an welches so wie in meinem Beispiel alle Buchstaben enthält , oder du vergleichst einfach stumpf ein aus deinem String konvertiertes char array mit den übergebenen chars und zählst einfach das vorkommen, dies hat allerdings zur folge das du dann für 26 Buchstaben if-anweisungen schreiben musst...

Sinnvoller ist also der Lösungsansatz mit dem Referenzarray du iterierst über dein zum char array konvertierten String, gleichst mit den zu findenden Buchstaben ab, dann an welcher stelle diese im Referenzarray stehen, und zählst dann diese Position in einem int array hoch.

Hier noch ein beispiel dies gibt dir ein int Array zurück

Java:
public static int[] countSingleLetters(String zeichenkette, char...chars){
		int results[] = new int[chars.length];
		
		char[] tokens = zeichenkette.toLowerCase().toCharArray();
		
		for (int i = 0; i < chars.length; i++) {
	        for (char c : tokens) {
	           if (c == chars[i]) {
	            results[i]++; 
            }
            }
        }
		
		return results;
	}

Hier dann der Aufruf und die Ausgabe :

Java:
int[] res = Zeichenkettenanalyse.countSingleLetters("Hallo", 'a','l');
	    
	    for (int i = 0; i < res.length; i++) {
	        System.out.println(res[i] + " ");
        }

Ausgabe :

Code:
1
2
 
Zuletzt bearbeitet:

zesa

Mitglied
AHHHH,
Danke,
also liegt es an der Aufgabenstellung, dass es nicht funktioniert.
Es hätte:
Java:
(String zeichenkette, char...chars)
heißen sollen und nicht
Java:
(String zeichenkette, char[] chars)

Super, Danke =)
Ich habe die System.out.print mit in die Hauptklasse übernommen und nicht unter die main, funktioniert aber dann auch.

Letzte Frage, dann bin ich durch:
Wie schaffe ich es die chars über die Eingabe nun an die Methode zu senden?
Mit einem Array geht da ja offensichtlich nicht,

Meine Lösung für ein Array wäre ja so gewesen, aber wie nun bei einer Folge von chars? ('a','l')???
Java:
System.out.print("Welcher Buchstabe(n) soll(en) hier gesucht werden:");
    		String t4 = sc3.nextLine();
    		for (int i = 0; i < t4.length(); i++) {
    			c2[i] = t4.charAt(i);
    		}
    		Zeichenkettenanalyse.zeichenZaehlen2(t3,c2);
}
 

kaoZ

Top Contributor
Hier kommt dann der Scanner zum einsatz, entweder in der main , oder direkt in der Methode:

Java:
public static void main(String[] args) {
	   
	    Scanner sc = new Scanner(System.in);
	    
	    char[] arr = sc.nextLine().toCharArray();
	    
	    int[] res = Zeichenkettenanalyse.countSingleLetters("Hallo", arr);
	    
	    //Ausgabe
	    
	    for (int i = 0; i < res.length; i++) {
	        System.out.println(res[i] + " ");
        }
	    
	    sc.close(); // Scanner schließen
    }

Ein/Ausgabe

Code:
a,i,o  <---Eingabe in der Konsole
1 
0 
0 
0 
1
 

zesa

Mitglied
Java:
sc.nextLine().toCharArray();
Das hatte mir gefehlt :-E

Jedoch darf ich nicht
Code:
a,i,o
Eingeben,
dann wird nämlich "," auch gezählt :-D


VIELEN VIELEN DANK, Ich such den "Danke Button", finde den aber nicht =)
TROTZDEM DANKE DANKE DANKE

schönes Restwochenende noch
 

kaoZ

Top Contributor
Jedoch darf ich nicht
Code:
a,i,o
Eingeben,
dann wird nämlich "," auch gezählt

gezählt ja , aber für die Ausgabe ist es ja nicht relevant, da nur die übergebenen Buchstaben gezählt werden :)

man könnte hier auch mit einer Abwandlung von .split(","); arbeiten welches anstatt eines String[] ein char[] zurückliefert ;)

Den Danke Button gibt es erst wenn du 8 Beiträge verfasst hast ;)
 
Zuletzt bearbeitet:

Neue Themen


Oben