Java Anordnung eines String Inputs nach einem bestimmten Muster in Java

vram78

Lieutenant
Registriert
Dez. 2015
Beiträge
712
Hi,

Ich bin blutiger Anfänger und hätte folgende Frage: Gibt es eine Methode, der ein String neu anordnet? Also z.B. gebe ich als Input
Hallo1234 ein.

Dann soll es als Output h1a2l3l4o ausgeben. Ich habe davor selbstverständlich gegoogelt aber irgendwie finde ich zu dem Vorhaben nichts. Ich finde in der Klasse String nichts dergleichen, genau so wenig wie toCharArray() oder Arrays.sort()

Die Aufgabe (Aus einer Lernplattform):

1643818248096.png


Pseudocode:

Code:
Aufforderung Textinput

Speicherung des Inputs in Variable text

Neue Anordnung des Inputs, zuerst Zahl, dann Buchstabe, Zahl, Buchstabe...

oder zuerst Buchstabe, dann Zahl, Buchstabe...


Speicherung des Inputs in neue Variable textNeu


Wenn nur Ziffern, dann Fehler in der Ausgabe
Wenn nur Buchstaben, dann Fehler in der Ausgabe
Wenn abwechselnd nicht möglich, dann Fehler in der Ausgabe
Wenn Sonderzeichen enthalten, dann Fehler in der Ausgabe


Ausgabe des Inputs

Code:
Java:
package anordnung;

import java.util.Arrays;
import java.util.Scanner;

public class Anordnung {

    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        
        
        
        String textNeu;
        String text;
        
        System.out.println("Gib den Text ein: ");
        text = scanner.next();
        

    }

}

Ich weiß, im Grunde habe ich noch kein Code geschrieben. Ich verstehe aber nicht, wie ich aus der Bibliothek von den zig tausenden Methoden/Klassen die richtige finden soll, der genau das macht, was ich möchte.

MFG
 
Du musst dir den neuen String schon selbst basteln, gibt nichts fertiges für sowas bzw. wäre die Aufgabe dann recht unsinnig. Du musst vorher ja ohnehin prüfen, ob die Eingabe valide ist und kannst im positiven Fall den Eingabestring in zwei Strings teilen (selbst das müsstest du aber nicht zwingend). Danach kannst du den neuen Ausgabestring daraus zusammenbauen. Wie du das machst ist deine Aufgabe ;)

Konkrete Fragen können beantwortet werden, musst also erst noch weiter etwas selbst leisten.
 
Priesnitz?

vram78 schrieb:
Ich weiß, im Grunde habe ich noch kein Code geschrieben. Ich verstehe aber nicht, wie ich aus der Bibliothek von den zig tausenden Methoden/Klassen die richtige finden soll, der genau das macht, was ich möchte.
Das ist das was du erlernen sollst. ist aber nicht direkt teil der aufgabe.
vram78 schrieb:
Wenn nur Ziffern, dann Fehler in der Ausgabe
Beispiel:
https://www.google.com/search?q=str...4dUDCA0&uact=5&oq=string+check+if+number+java

und dann findest du jede menge tolle dinge wie:
https://stackabuse.com/java-check-if-string-is-a-number/

oder er will, dass du ueber den string iterierst und zeichen fuer zeichen Kriteren ueberpruefst.

kannst halt eine isChar und eine isNumber Methode schreiben
 
Du könntest dir die einzelnen Zeichen ansehen und überprüfen, ob es sich um eine Nummer oder einen Buchstaben handelt. So kannst du die Zeichen trennen. Dann hast du 2 "Listen" von Zeichen. Sind die beiden Listen gleich lang, kannst du abwechseln je ein Zeichen daraus nehmen und zum Ergebnis zusammenfügen.
 
Deine Aufgabe besteht auch darin, die JavaDocs zur String-Klasse und anderen Klassen anzuschauen. Dann findest du evtl. Methoden, die für die Lösung in Frage kommen.
Beginne einfach mal mit den Prüfungen.

Und google könnte dir für Teilaufgaben auch gut helfen. Damit findest du Beispiele, in denen du dir die verwendeten Klassen und Methoden in den JavaDocs anschauen kannst.
 
  • Gefällt mir
Reaktionen: madmax2010
Hier musst du einen Algorithmus entwickeln. Das hat mit der Sprache an sich eigentlich wenig zu tun.

  • Ich würde wie folgt vorgehen:
  • Ermittle die Länge des Strings
  • Teile den String bei der Hälfte oder, wenn die Länge ungerade ist, bei der Hälfte + 1
  • Ermittle abwechselnd das nächste Zeichen beider Hälften und prüfe:
    • Ist es bei Teil 1 ein Buchstabe
    • Ist es bei Teil 2 eine Zahl
    • Hänge beides an den Zielstring an
    • Wenn nicht, Fehlermeldung

Das wärs glaub ich schon.
 
Interessantes Problem. 🤔

Wie schon erwähnt, in den "tausenden Methoden" kannst Du gerne schnüffeln, aber fertig wirst Du da nix finden. Warum auch? Was sollte das Einsatzgebiet für eine solche Methode sein?

Aber zum Problem an sich. Es ist ja schon mal relativ klar, was die da wollen.

Schritt 1: Bestimme Länge von String (total) sowie den Teilstrings "nur Ziffern" und "nur Buchstaben".
Schritt 2: Der Betrag |länge "nur Ziffern" - länge "nur Buchstaben"| darf nur 0 oder 1 sein. Genaugenommen kannst Du sogar mit (-1) was anfangen, daher mag der absolute Betrag sogar eher kontraproduktiv sein.
- Jedenfalls, wenn hinten was rauskommt kleiner -1 oder größer 1, dann gibt es keine Lösung und Du bist fertig.

Schritt 3: Die weiter oben ermittelten Teilstrings durch ein merge sort schieben. Dabei in Abhängigkeit von dem Ergebnis zwischen -1 und 1 die Parameter vertauschen.

Schritt 4: Wenn alles richtig gemacht wurde, bist Du fertig.

Was bleibt ist die Bestimmung der Teilstrings. Denke mal, da könnte man Richtung regex gucken. Oder halt eine Schleife 0 bis "Inputlänge - 1" und dann jedes Zeichen in Abhängigkeit von "Ziffer" oder "Zahl" entweder hierhin oder dorthin schieben.
 
Ich würde mir zwei Behilfs-Arrays erstellen, jeweils eins für die Kleinbuchstaben und eins für die Zahlen.
Dann würde ich über das ursprüngliche Array iterieren und je nachdem, ob das aktuelle betrachtete Zeichen ein Kleinbuchstabe oder eine Zahl ist, in das passende Array kopieren.
Danach würde ich die beiden Behilfs-Arrays "zippen".
 
Es wird keine Klasse/Methode geben die das kann, Du musst schauen wie Du das mit den Sprachkonstrukten der Klassenlibrary hinbekommen kannst.

Ich würd Mal bei der String Klasse anfangen zu schauen, die hat viele Methoden:

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html

Mit einer for Schleife, Length, CharAt und Arrays oder ArrayLists um sich Dinge zu merken sollte sich schon einiges erreichen lassen.

Google ist auch Dein Freund, Google kann Dir bestimmt sagen, wie man in Java rausfinden kann, ob ein Character eine Zahl ist.
 
vram78 schrieb:
Was meinst du damit? Ich möchte es ja in Java schreiben
Ja, aber diese Art von Problemstellungen sind bewusst so ausgelegt, dass du nicht einfach schreiben kannst:

Java:
TolleZauberKlasse.SortiereBuchstabenUndZahlenRichtig(str);

Und das geht auch in keiner anderen Sprache. Du musst einen Algorithmus entwickeln - sprich, mit allgemeinen vorhandenen Gegebeneheiten etwas zusammen stellen, was dein Problem löst.

Z.B.:
Java:
string atoz = "abcd...z";
string zerotonine = "0123456789";
int length = str.length();
int middle = Math.ceil(length / 2);
string result = "";
for(int i=0;i<middle;i++) {
    int secondIndex = middle + i;
    char letter = str.charAt(i);
    char number = str.charAt(secondIndex);
    if(!atoz.contains(letter) || !zerotonine.contains(number)) {
        // ungültiger string
        break;
    }
 
    result.append(letter).append(number);
 }

Das da ist übrigens "Pseudocode", der wird genau so nicht funktionieren, aber er erklärt das Prinzip.
 
Also ich zerbrich mir die ganze Zeit den Kopf darüber, wie ich es am Besten umsetze. Ich verstehe im übrigen nicht, wieso ich die Länge des Inputs ermitteln soll. Also was bringt mir das?
Ergänzung ()

RalphS schrieb:
Der Betrag |länge "nur Ziffern" - länge "nur Buchstaben"| darf nur 0 oder 1 sein.
Meinst du als Wahrheitswert?
 
vram78 schrieb:
Also ich zerbrich mir die ganze Zeit den Kopf darüber, wie ich es am Besten umsetze. Ich verstehe im übrigen nicht, wieso ich die Länge des Inputs ermitteln soll. Also was bringt mir das?
"Sind beide Zeichengruppen gleichlang..." Steht in der Aufgabenstellung und da muss man noch nicht viel Ahnung von Programmierung haben um zu verstehen wieso die Ermittlung gebraucht wird.
 
sandreas schrieb:
  • Ermittle die Länge des Strings
  • Teile den String bei der Hälfte oder, wenn die Länge ungerade ist, bei der Hälfte + 1
Aber wieso die Länge? Ich möchte ja einfach programmieren, dass er nach einem Input wie Hallo1234 die Buchstaben und Zahlen unterscheiden soll und die Zahlen zwischen die Buchstaben setzen soll und anders rum soll es auch möglich sein
Ergänzung ()

sh. schrieb:
"Sind beide Zeichengruppen gleichlang..."
Ja stimmt, habe ich komplett übersehen. :lol: Das heißt, wenn Buchstaben gleich lang wie Ziffern, dann ist es egal, ob zuerst mit Buchstabe oder Ziffer angefangen wird

Das Problem bei mir ist ja der, dass ich zwar weiß, was Schleifen und so weiter sind, aber ich kann in der Praxis keinen Reim daraus machen. Ich weiß einfach nicht, wie ich es angehen soll. Mir ist klar, dass es in der JavaDoc zur String-Klasse viele Methoden gibt, wie aber bringe ich es in Verbindung beziehungsweise baue eine Programmlogik ein?
 
Zuletzt bearbeitet:
Hast du mal versucht das Thema etwas mehr Abstrakt erstmal auf dem Papier durch zu denken?
Ganz unabhängig von irgendwelchen Methoden/Klassen oder sonst was.
Ganz einfach die Schritte auf Papier bringen und dann hat man ein Startpunkt um nach den Sachen zu googlen
 
  • Gefällt mir
Reaktionen: vram78
Mystery1988 schrieb:
erstmal auf dem Papier durch zu denken?
In Form eines Programmablaufplans? Ne, noch nicht. Soweit ich das mal gelesen hatte, machen es ja Softwareentwickler auch so, dass sie vor der Implementierung eine Art Plan machen. Ich habe das bisher noch nie so gemacht, weil ich es direkt umsetzen wollte.

Also sowas in der Richtung?
1644231900047.png
 
Genau in die Richtung habe ich es gemeint.
Einfach aufschreiben, was du denkt was du machen musst um dein Ziel zu erreichen.
Z.b. Was musst du machen um zu sehen, ob Zeichen oder Zahlen vorhanden sind.
Über jedes Zeichen iterieren und überprüfe ist es eine Zahl oder Zeichen.

Das machst du für jeden Schritt/Aufgabe.

Bis der Code optimiert ist, durchläuft man automatisch mehrere Interationen und spätestens, wenn du das nach einem Jahr anschaust, sieht du weiter Optimierungen.
Ihr haben viele andere Teilnehmer schon viele Hilfestellungen gegeben.
 
Zurück
Oben