Java, programmieren - kann man das irgendwie schöner lösen?


30.11.2021, 12:24

Das wurde nicht ganz so formatiert wie gewünscht, sollte dennoch verständlich sein

 - (Computer, programmieren, Java)

6 Antworten

Von Experte heizfeld bestätigt

Kürzen kann man immer, die Frage ist, ob man es dann noch versteht oder es übersichtlicher wird...

Eine Schleife ist halt immer schöner als zwei und ich finde den Methodennamen unglücklich gewählt, denn die Methode gibt nicht die Länge von s zurück - daher passt der Name nicht zu dem, was die Methode tut.

Und natürlich kann man das kürzen. In etwa so (hab's nicht probiert, aber Du siehst, worauf's rausläuft):

string vowels = "aeiouAEIOU";
int length = 0;
for (char c : letters) 
{
  length += (vowels.indexOf(c) > -1) ? 3 : 1;
}
return length;

Werden in dem Code die nicht-Vokale nicht 2x gezählt? Ansonsten könntest du noch mit einer weiteren foreach Schleife arbeiten. Zum Beispiel so:

public static int determineLength(String s) {
	char[] vocale = {'a','e','i','o','u'} ;
	char[] letters = s.toCharArray();
	int length = 0;
	for (char c : letters) {
		length+=1;
		for(char e : vocale) {
			if (c == e || c == Character.toUpperCase(e))
			        length+=2;
		}
	}
	return length;
}

Die ansprechendste Variante hat dir allerdings ohwehohach schon geliefert.

Ich verstehe den Sinn der Funktion nicht so ganz. Du zählst jedes Zeichen zwei Mal und jeden Vokal vier mal.

In kurz würde es etwa so aussehen:

public static int determineLength(String s) {
	return ((int)s.chars().mapToObj(Character::toString).filter(c->"aeiouAEIOU".contains(c)).count() + s.length()) * 2; 
}
GuteAntwort2021  30.11.2021, 15:42

Diese Variante würde 4 für einen Vokal liefern und 2 für alles andere, oder nicht? :)

Da fehlt noch ein

return ... - s.length()

am Ende, denke ich.

0
daCypher  01.12.2021, 08:36
@GuteAntwort2021

Ja, hab ich ja geschrieben. Die Funktion macht das gleiche, wie die Funktion in der Frage, nur dass sie halt kürzer ist. Wofür das gut sein soll, oder ob es überhaupt das ist, was der Fragesteller machen wollte, weiß ich auch nicht.

0
vamosalaplaya17 
Fragesteller
 02.12.2021, 11:18

Gut, ich wollte nicht zwingend das ganze Programm beschreiben, aber ich versuche mich mal kurz zu fassen: Der Nutzer gibt ein Wort an, zum Beispiel ein einfaches "hallo". Dieses Wort wird dann auf Vokale überprüft und an jedem Vokal werden schließlich zwei weitere Buchstaben angehängt.

Ich habe das dann so gelöst, dass die Methode ausrechnet wie lang das Wort mit den angehängten Buchstaben sein wird, das Ergebnis ist dann die Länge des Arrays, welches das neue Wort, mit den angehängten Buchstaben, speichert.

Falls es einen Vokal gibt wird die Länge um 3 hochgezählt (Vokal + 2 weitere Buchstaben), falls nicht, wird diese nur im 1 hochgezählt (kein Vokal = nichts muss angehängt werden). Hier wollte ich dann lediglich sehen, ob man die Methode, die ich dazu geschrieben habe, kürzen könnte.

Klar ergibt das Programm nicht sonderlich viel Sinn, ist halt eine Aufgabe fürs Studium. 😅

0
vamosalaplaya17 
Fragesteller
 02.12.2021, 11:27
@vamosalaplaya17

Da viele darauf hingewiesen haben, dass es falsch hochzählt, habe ich es gerade auch gemerkt. Liegt daran, dass ich anfangs nicht bedacht hatte, dass man großgeschriebene Vokale auch dazuzählen muss, wodurch ich am Ende panisch die zweite for-Schlefe hinzugefügt habe, ohne wirklich an der Auswirkung zu denken. 😂

0
daCypher  02.12.2021, 11:33
@vamosalaplaya17

Dann funktioniert einerseits deine Methode nicht so, wie gewünscht (sie zählt für jeden Vokal +4 und jedes andere Zeichen +2, weil du ja zwei Schleifen hast) und andererseits ließe sich das ursprüngliche Problem auch viel kürzer lösen.

public static String extendVocals(String original, String extension) {
	return original.replaceAll("(?i)[aeiou]", "$0"+extension);
}

Damit wird an jeden Vokal das angehangen, was als "extension" übergeben wird.

So kannst du es z.B. aufrufen:

System.out.println(extendVocals("Hello, World!", "bo"));

Ergebnis: Hebollobo, Woborld!

0

Mach den String mit .toLowerCase() klein, dann hast du schonmal eine ganze Schleife weniger, da du dann keine Grossbuchstabrn mehr prüfen musst.

Die if-Abfrage könnte man auch durch einen Switch ersetzen, das ist dann aber eher Geschmackssache.

Woher ich das weiß:Berufserfahrung – Informatiker Applikationsentwicklung

Sieht meiner Meinung nach sehr ordentlich und übersichtlich aus