Strings hochzählen

Krischan

Mitglied
Hallo,

ich habe gerade eine Übungsaufgabe, bei der ich nicht weiterkomme.

Das Programm soll nach zwei Wörter fragen und diese dann in einer Zeile ausgeben. Getrennt sollen die Wörter mit Punkten sein. Die ausgegebene Zeichenlänge soll 30.
Beispiel: Hallo.....................Welt

Hier mein bisher geschriebener Code:

import java.util.Scanner;
public class test {

public static void main(String[] args) {

{
Scanner scan = new Scanner( System.in );
int text1, text2, text;
String string1, string2, gesamt, punkt;
punkt = (".");



System.out.println("Geben sie das erste Wort ein");
string1 = scan.nextLine();
text1 = string1.length();

System.out.println("Geben sie das zweite Wort ein");
string2 = scan.nextLine();
text2 = string2.length();

gesamt = string1 + string2;
text = gesamt.length();

while (text <= 30)
Hier weiß ich einfach nicht wie ich den String "punkt" hochzählen soll UND wie ich ihn dann wieder zwischen string 1 und string 2 plaziere

System.out.println(gesamt);


}


}

}
 
X

Xyz1

Gast
Bevor Rückfragen kommen, nein das löst man nicht funktional:

Java:
	private static String c(String a, String b) {
		while ((a + b).length() < 30)
			a += '.';
		return a + b;
	}

	public static void main(String[] args) throws Exception {
		System.out.println(c("Hallo", "du"));
	}
 
K

kneitzel

Gast
Bevor Rückfragen kommen, nein das löst man nicht funktional:

Java:
    private static String c(String a, String b) {
        while ((a + b).length() < 30)
            a += '.';
        return a + b;
    }

    public static void main(String[] args) throws Exception {
        System.out.println(c("Hallo", "du"));
    }

Also diese Lösung halte ich für wenig optimal, da Du hier sehr viele Strings erstellst durch dieses zusammenfügen von Strings.

Das kann man stark vermindern, indem man halt einmal die benötigte Anzahl an Punkten berechnet (Dann entfällt das a+b in jedem Durchlauf) und dann ist hier auch der StringBuilder angebracht.

Oder eine andere Alternative ist String.format - damit kann man eine Zeichenkette aus Leerzeichen der gewünschten Länge erstellen um dann halt die Leerzeichen durch . zu ersetzen:
Java:
        String a = "Hallo";
        String b = "Welt!";
        System.out.println(a + String.format("%" + (30-a.length()-b.length()) +"s", "").replace(" ", ".") + b);
 

mrBrown

Super-Moderator
Mitarbeiter
Der Compiler optimiert das weg, Du wirst keinen Geschwindigkeitsunterschied feststellen
Unsinn. Eben das optimiert der nicht weg.

Und da du mir nicht glauben wirst, hier sind Benchmarkergebnisse (length ist die Länge der beiden Strings):

Code:
Benchmark                        (length)  Mode  Cnt      Score    Error  Units
StringBenchmark.dumb                    1  avgt   10   1176,242 ± 28,076  ns/op
StringBenchmark.dumb                    3  avgt   10    955,941 ±  5,691  ns/op
StringBenchmark.dumb                   10  avgt   10    446,105 ±  1,126  ns/op
StringBenchmark.lengthExtracted         1  avgt   10    495,656 ±  3,801  ns/op
StringBenchmark.lengthExtracted         3  avgt   10    414,179 ±  1,362  ns/op
StringBenchmark.lengthExtracted        10  avgt   10    186,987 ±  1,449  ns/op
StringBenchmark.stringBuilder           1  avgt   10    134,628 ±  6,827  ns/op
StringBenchmark.stringBuilder           3  avgt   10    129,366 ±  5,816  ns/op
StringBenchmark.stringBuilder          10  avgt   10    102,463 ±  1,721  ns/op

StringBenchmark.format                  1  avgt   10   1029,457 ± 15,137  ns/op
StringBenchmark.format                  3  avgt   10    944,531 ±  7,513  ns/op
StringBenchmark.format                 10  avgt   10    884,033 ±  6,142  ns/op
StringBenchmark.streams                 1  avgt   10  13375,974 ± 76,527  ns/op
StringBenchmark.streams                 3  avgt   10  10537,755 ± 53,091  ns/op
StringBenchmark.streams                10  avgt   10   3098,467 ± 20,582  ns/op

StringBenchmark.repeat                  1  avgt   10     58,861 ±  0,791  ns/op
StringBenchmark.repeat                  3  avgt   10     50,555 ±  0,110  ns/op
StringBenchmark.repeat                 10  avgt   10     48,398 ±  1,125  ns/op

dumb ist deine Version, lengthExtracted ist nur das entfernen der Konkatenation im Schleifenkopf, stringBuilder das ganze mit StringBuilder statt direkter Konkatenation.

format und streams sind die anderen beiden Varianten aus diesem Thread (die nicht den Anspruch hatten, irgendwie performant zu sein).

repeat ist die optimale Variante mit String.repeat.

Java:
public String lengthExtracted(String a, String b) {
    while (a.length() + b.length() < 30) {
        a += '.';
    }
    return a + b;
}

Java:
public String stringBuilder(String a, String b) {
    StringBuilder builder = new StringBuilder(a);

    while (builder.length() + b.length() < 30) {
        builder.append(".");
    }
    return builder.append(b).toString();
}

Java:
public String repeat(String a, String b) {
    return a + ".".repeat(30 - a.length() - b.length()) + b;
}
 
K

kneitzel

Gast
Das mit der Optimierung war auch in meinen Augen unwahrscheinlich, denn in der Schleife erzeugt a=a+"."; ja immer eine neue String Instanz. Für uns ist die Operation relativ einfach und übersichtlich, aber das ist für den Compiler erst einmal einfach eine komplett neue Instanz. Und diese Instanz wird dann in der Bedingung wieder benutzt, aber hier ist auch wieder eine Operation beteiligt, die eine komplett neue Instanz erzeugt um da dann length() aufzurufen.

Also insgesamt nichts, was einfach zu optimieren ist. Das lässt sich nur mit tiefgreifendem Wissen zu String und der Implementierung von String optimieren....

Und was ich meine ist: Anfänger sollen gewisse Dinge von Anfang an richtig lernen. Und da gibt es gewisse Dinge, die aus meiner Sicht schnell gelehrt werden müssten. Das sind dann so Punkte wie z.B. schnell hin zur Objektorientierten Denkweise (Sorry, das geht doch nicht anders. Mit anderen Instanzen wird ja auch schon gearbeitet!) und geht dann auch hin zu gewissen Dingen, die nicht gemacht werden sollten. Das sind dann so Dinge wie Strings zusammen basteln für SQL Abfragen statt Nutzung von Parametern oder eben dieses generelle, massive Zusammenbasteln von Strings.

Denn es geht hier nicht nur um die Performance bei der Ausführung, sondern es gibt ja noch deutlich mehr Dinge: Der GC muss mehr machen, mehr Speicher wird verbraucht, ....

Aber ok, es ist hier wohl auch immer die Frage, welches Ziel man verfolgt: Will ich wirkliche Software Entwickler oder will ich nur ein wenig "rumspielen". In Schule und Studium wird halt oft kein wirkliches Ziel verfolgt, bzw. dies scheint sehr willkürlich. Aber das ist ein generelles Thema, das ich hier nicht anfangen will (Aber da gibt es ja auch im Netz genug zu. Universitäten beklagen ja oft genug, dass die Schule unzureichend auf das Studium vorbereitet und so ....).
 
X

Xyz1

Gast
Ändert alles nichts daran, dass man das so, vielleicht noch unter Einsatz eines StringBuilder s, genau so machen sollte - und nicht anders.
 
K

kneitzel

Gast
Ändert alles nichts daran, dass man das so, vielleicht noch unter Einsatz eines StringBuilder s, genau so machen sollte - und nicht anders.
Das ist Deine Meinung. Meiner Meinung nach sollte man sich eine Problematik genauer ansehen um diese dann zielführend zu lösen.

Und wenn es einen direkten Weg gibt, dann würde ich immer diesen nehmen. Direkter Weg ist hier aus meiner Sicht eben das klare Verständnis, dass die Anzahl der "." zwischen den beiden Strings genau 30 - Länge A - Länge B ist. Und dann baue ich den String genau so auf.
Das ist eine Lösung, die ich der Schleife vorziehen würde zumal diese Lösung einfach und klar erkennbar ist.

Und von einem Software Entwickler erwarte ich, dass er Lösungen einfach aufbaut. Wieso ständig Strings zusammensetzen wenn es nur um die Länge geht? Das (a+b).length führt unnötige Operationen aus. KISS Prinzip ist hier aus meiner Sicht nicht eingehalten.

Daher meine Sicht:
- Ist es eine valide Lösung für einen Anfänger: Ja
- Ist es die Musterlösung, die zeigt: So sollte es aussehen? Klares Nein.

Lösungen wie mein String.format mit replace sind natürlich auch keine Musterlösung (Aber valide, repeat gibt es in Java 8 noch nicht? Zumindest sehe ich das hier nicht.)
Aber meine Musterlösung würde den StringBuilder mit einfließen lassen alleine um diese Problematik schon einmal erwähnt zu haben. Eine zweite Lösung, die ich als valide vorstellen würde, würde in einer Schleife von 1...n die "." zusammen setzen.

Aber das ist natürlich nur meine Meinung und es steht jede frei, seine eigene Meinung zu haben.
 
K

kneitzel

Gast
Nei
Ja, repeat kam mit Java 11 :)

Die Lösung mit format führt allerdings zu Fehlern, wenn die ursprünglichen Strings Leerzeichen enthalten ;)
Daher ist das replace ja nur auf dem erzeugten String. Die Variablen (a und b) werden nicht behandelt.

Somit kann da drin sein was will, auch Leerzeichen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Inhalt eines Strings um eins hochzählen Java Basics - Anfänger-Themen 19
E Strings hochzählen oder elegante alternative? Java Basics - Anfänger-Themen 3
R Datentypen Das Verhalten von Strings als Datentypen Java Basics - Anfänger-Themen 7
N Nachkommastellen von Strings Java Basics - Anfänger-Themen 3
T Strings unveränderlich???? Java Basics - Anfänger-Themen 22
B Alle Strings bis zu einer Maimallänge aufzählen, die Bedingung erfüllen Java Basics - Anfänger-Themen 13
S Die durchschnittliche Länge der Strings Java Basics - Anfänger-Themen 11
M Operatoren Strings mit Vergleichsoperatoren, funktioniert das? Java Basics - Anfänger-Themen 9
S Variablen Letzte Zeile eines Strings entfernen Java Basics - Anfänger-Themen 1
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
P9cman Tipps für Rekursive Aufgaben mit Strings oder allgemein Java Basics - Anfänger-Themen 2
sserio StringBuilder und Strings Java Basics - Anfänger-Themen 8
J Größe eines Strings in Pixel Java Basics - Anfänger-Themen 18
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
N Strings verpflechten Java Basics - Anfänger-Themen 4
G Strings auf Gleichheit prüfen - Aufgabe vom Prof. Java Basics - Anfänger-Themen 5
A 2 Strings vergleichen in einer methode wenn man mit Globalen variablen arbeitet Java Basics - Anfänger-Themen 12
L Strings aneinanderhängen Java Basics - Anfänger-Themen 2
M Strings vergleichen Java Basics - Anfänger-Themen 10
Nerdinfekt BMI Rechner, fehler beim Zurückgeben des Strings? Java Basics - Anfänger-Themen 2
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
S 2 Strings mit Equals vergleichen Java Basics - Anfänger-Themen 11
Q Besitzen zwei Strings identische Buchstaben, nur in anderer Reihenfolge? Java Basics - Anfänger-Themen 10
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
C Ternärer Operator mit Strings Java Basics - Anfänger-Themen 3
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
P Verketten, Aneinanderreihen von Strings Java Basics - Anfänger-Themen 2
M Strings mit gerader und ungerader Länge ausgeben Java Basics - Anfänger-Themen 10
J Alle Werte eines Strings zusammen addieren Java Basics - Anfänger-Themen 15
W Strings und das parsen Java Basics - Anfänger-Themen 8
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
D Vergleichen von Strings Java Basics - Anfänger-Themen 6
M Konkatenation von zwei Strings Java Basics - Anfänger-Themen 6
J Abbruchbedingung in Schleife/ Untersuchung von Strings Java Basics - Anfänger-Themen 2
S Buchstaben in Großbuchstaben (Strings) Java Basics - Anfänger-Themen 5
X Anagramm mit Strings und Methode Java Basics - Anfänger-Themen 53
P geschachtelte Schleife mit Strings Java Basics - Anfänger-Themen 2
P Strings mit der Axt zerteilen Java Basics - Anfänger-Themen 7
F Alle Zeichenkombinationen eines Strings iterativ herausfinden Java Basics - Anfänger-Themen 26
J Strings untereinander in einer Liste vergleichen Java Basics - Anfänger-Themen 18
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
F Vergleiche mit charAt funktioniert bei Strings nicht, was tun? Java Basics - Anfänger-Themen 5
T Probleme mit Strings Java Basics - Anfänger-Themen 6
J Unveränderbarkeit von Strings Java Basics - Anfänger-Themen 3
O Klammerung bei Strings Java Basics - Anfänger-Themen 10
A Liste aus drei Strings erstellen Java Basics - Anfänger-Themen 5
N Zwei Strings mit "==" vergleichen warum TRUE Java Basics - Anfänger-Themen 2
G Teil(e) eines Strings entfernen wenn spezifische Zeichen (< & >) vorkommen Java Basics - Anfänger-Themen 5
D ergebnis.matches("[1-9]?[0-9].[0-9][0-9]?") ein teil eines größeren Strings Java Basics - Anfänger-Themen 12
J Breite eines Strings bestimmen Java Basics - Anfänger-Themen 4
D Zwei Strings sind gleich bei if aber nicht true Java Basics - Anfänger-Themen 2
F JList Elemente mit Strings vergleichen Java Basics - Anfänger-Themen 12
J Strings sind gleich werden aber ungleich ausgewertet Java Basics - Anfänger-Themen 2
N Vergleich von Strings schlägt fehl.. Java Basics - Anfänger-Themen 5
B 4 Strings, Anfangsbuchstaben muss unterschiedlich sein Java Basics - Anfänger-Themen 12
P Strings in String Array schreiben Java Basics - Anfänger-Themen 13
J Input/Output Strings aneinander reihen mit while schleife Java Basics - Anfänger-Themen 25
B mir nur die Gesamtzahl von einzigartigen Strings aus Array ausgeben lassen Java Basics - Anfänger-Themen 5
R Erste Schritte Sicheres einlesen eines Strings Java Basics - Anfänger-Themen 2
F Maximale Länge eines Strings Java Basics - Anfänger-Themen 5
J Best Practice Datum Differenz aus zwei Strings ermitteln Java Basics - Anfänger-Themen 8
Jinnai4 Strings ersetzen Java Basics - Anfänger-Themen 9
R Übergeben eines Array Strings an einen Spinner Java Basics - Anfänger-Themen 4
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
L Prüfe, ob die im String Array enthaltenen Strings aufsteigend sind. Java Basics - Anfänger-Themen 19
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
DaCrazyJavaExpert Variablen Zahlen aus Strings auslesen Java Basics - Anfänger-Themen 4
C 2 Strings Java Basics - Anfänger-Themen 15
T befehle unterschiedlicher anzahl an strings wiedergeben Java Basics - Anfänger-Themen 2
JavaNewbie2.0 Strings in andere Klassen importieren. Java Basics - Anfänger-Themen 2
D BlueJ Java: Strings voneinander trennen Java Basics - Anfänger-Themen 11
javaerd Wie kann ich Brute Force Methode mit Strings erweitern Java Basics - Anfänger-Themen 1
R Erste Schritte Strings "einrücken" Java Basics - Anfänger-Themen 3
Yamie ArrayList<Object> als Liste von Strings ausgeben? Java Basics - Anfänger-Themen 15
B gemeinsames Vorkommen der charactere von 2 Strings als String zurückgeben Java Basics - Anfänger-Themen 5
R Teilinhalt eines Strings testen Java Basics - Anfänger-Themen 10
H Erste Schritte JTree: Instanzen einer Klasse speichern oder Namen/Strings... Java Basics - Anfänger-Themen 4
L Werte von Strings ? Java Basics - Anfänger-Themen 1
L Strings und Arrays - Expand Java Basics - Anfänger-Themen 12
I Schachbrett aus beliebigen Strings erstellen Java Basics - Anfänger-Themen 3
Syncopated Pandemonium Verketten von Strings funktioniert nicht Java Basics - Anfänger-Themen 4
F Wahrscheinlichkeit von Strings Java Basics - Anfänger-Themen 3
MiMa Splitten eines Strings Java Basics - Anfänger-Themen 5
T Hashfunktion für Strings Java Basics - Anfänger-Themen 3
C Zeilenumbruch für langes Strings Java Basics - Anfänger-Themen 2
J Variablen Strings mit Zeilenumbrüchen in neues Array Element Java Basics - Anfänger-Themen 1
T Datentypen compareTo() u. equals() bei Strings Java Basics - Anfänger-Themen 3
H Strings vergleichen & sortieren Java Basics - Anfänger-Themen 20
H Erste Schritte Längstes Wort eines Strings herausfinden Java Basics - Anfänger-Themen 7
D Problem beim umwandeln eines Strings in eine Dzezimalzahl Java Basics - Anfänger-Themen 6
G Strings mit Scanner (nextLine) einlesen Java Basics - Anfänger-Themen 7
T Strings ersetzen mit \ Java Basics - Anfänger-Themen 10
K Strings bearbeiten Java Basics - Anfänger-Themen 14
N Bestimmte Zeichen eines Strings umwandeln Java Basics - Anfänger-Themen 4
L Java Strings Buchstaben vertauschen Java Basics - Anfänger-Themen 4
L Strings in einem JOptionPane farbig Java Basics - Anfänger-Themen 2
A Wie bekomme ich zwei Strings in eine ArrayList Java Basics - Anfänger-Themen 4
C Chars eines Strings mit for schleife rückwärts auslesen Java Basics - Anfänger-Themen 8
J Buchstabe (char) an zufällige Position eines Strings einfügen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben