Position einer unbekannten 3-stelligen-Zahl in einem String finden

Groomit

Mitglied
Hallo,

ich sehe im Moment den Wald vor lauter Bäumen nicht.

Der Wert der 3-Stelligen Zahl kann einen beliebigen Wert annehmen.
Java:
        String s = "abcdef 255 jklö";
        Pattern p = Pattern.compile(".*\\d{3}.*");
        Matcher m = p.matcher(s);
        boolean b = m.matches();

Damit weiß ich lediglich, das eine 3-stellige-Zahl im String vorhanden ist, ich benötige aber auch die Position im String.

Hat jemand einen heißen Tipp?

Danke und Gruß
Groomit
 

Robert Zenz

Top Contributor
Wobei da dann vermutlich die .* weg müssen, denn sonst fängt es immer an index 0 an fürchte ich.

Hast Recht, sollte man als Gruppe machen:

Java:
Pattern.compile(".*?(<NUMBER>\\d{3}).*?");
matcher.start("NUMBER");

Oder halt ohne die fuehrenden Punkte:

Java:
Pattern.compile("\\d{3}");
matcher.start();

Bin gerade auch nicht taufrisch, stelle ich fest...
 

mihe7

Top Contributor
@Groomit, wäre gut, wenn Du die richtige Antwort auch markieren würdest, dann sieht man gleich in der Übersicht, dass die Frage beantwortet ist und kann sich das Lesen des Threads sparen.
 

KonradN

Top Contributor
Valide 3-stellige Zahlen
Und damit hast Du hier schon deutlich mehr in die Aufgabe hinein interpretiert, als gegeben.

Der TE schien mit seinem Algorithmus / regulären Ausdruck ja schon soweit zufrieden. Es störte ihn nur eine Sache:
Damit weiß ich lediglich, das eine 3-stellige-Zahl im String vorhanden ist, ich benötige aber auch die Position im String.
Daher kann man auf diesem regulären Ausdruck ja weiter aufsetzen, wie es getan wurde. Wenn man sich damit nicht weiter auseinander setzen möchte, dann könnte man die Zahl in eine Group setzen und auslesen - dann wäre auch ein String.indexOf denkbar als mögliche Lösung (So man nicht zu viel mit regulären Ausdrücken machen möchte.)



Bezüglich der "validen 3-stelligen Zahlen": Dies kann sehr vieles sein:
- Auf Grund des Beispiels könnte man annehmen, dass da Whitespaces zur Abgrenzung vorhanden sind.
- Es könnte aber auch einfach sein, dass der String das Format hat XXXXXzzzXXXXXX mit jeweils beliebigen Mengen X, jedes einzelne X ist ein beliebiges Zeichen (incl. Ziffern!) und es werden alle möglichen zzz mit jedem z eine Ziffer gesucht. Dann würde bei aaa1234aa sowohl die 123 als auch die 234 gesucht werden - unabhängig davon dass 1234 eben eine vierstellige Zahl wäre.
- Selbst wenn man valide 3-stellige Zahlen sucht, dann wäre 0123 ggf. keine valide 3 stellige Zahl, da es eben 4-Stellig ist. Wenn man die 0er nicht zählt, dann wäre 012 übrigens auch keine valide 3-stellige Zahl, da diese nach den angegebenen Regeln nur einer 12 entsprechen würde.

Hintergrund ist halt, dass wir nicht wissen, was da in dem String ist. Hier ist also nicht vom rein mathematischen Ansatz auszugehen, das nur eine Zahl an sich betrachtet, die für sich klar begrenzt ist sondern hier gehen wir von einer beliebigen Zeichenkette aus und es ist eben nicht gesagt, die diese Grenzen aussehen und was man da alles begrenzen muss. Daher ist 1234 keine 3-stellige Zahl. Der String "1234" enthält aber durchaus 2 3-stellige Zahlen: 123 und 234.

Valide 3-stellige Zahlen via Regex zu ermitteln, ist nicht so einfach.
Wenn man die Regeln kennt, dann kann man das durchaus als RegeEx darstellen. Dann muss vor der Zahl der Anfang des Strings sein oder beliebige Zeichen, die keine Ziffern sind. Dann dürften beliebige Anzahl 0er folgen. Dann kämen die 3 Ziffern und danach entweder keine Ziffer oder das Ende des Strings. (Das dürfte ungefähr dem entsprechen, das Du gemacht hast)

Ansonsten sollte man bei so Codes immer darauf achten, dass dieser lesbar ist. Eine Methode mit mehreren verschachtelten Schleifen und einigen if und if/else würde ich nicht darunter verstehe. Hier wäre ein Refactoring also dringend notwendig so man verständlichen Code haben möchte.

Ansonsten gibt es einen ganz einfachen Ansatz ohne Reguläre Ausdrücke der das Problem in einfache Teilprobleme unterteilt:
a) Ich splitte den String so auf, dass ich nur Zeichenketten mit Ziffern habe (ein split("[^0-9]") könnte das schon machen)
b) jetzt könnte man beliebige Prüfungen anwenden, die man für richtig erachtet und die Werte beliebig auswerten. (führende 0er könnte man weglassen so es mehr als 3 Stellen sind, lange Ziffern könnte man in die 3er Substrings aufteilen, u.s.w.) Wir kennen halt die Regeln nicht aber wir haben die Bedingung recht schön eigenständig gemacht.
c) Am Ende hat man die Zielmenge der Teilstrings und kann dann die Stellen, an denen diese sich befinden, ermitteln (Mehrmaliger Aufruf von String.indexOf).

Das einfach einmal zu meiner Sicht auf diese Aufgabenstellung.
 

Robert Zenz

Top Contributor
@Deface3 Versteh' mich jetzt nicht falsch, das ist recht schoener Code den du da geschrieben hast, aber das sind mit Abstand die schlechtesten Namen fuer Variablen die ich in letzter Zeit gesehen habe. "a" und "b" zum Beispiel sind komplett wertfrei. AUch wenn es kleine, schnelle Beispiele sind (oder vielleicht auch gerade dann) sollte man darauf achten brauchbare Variablennamen zu verwenden um das Beispiel klar zu gestalten.

Java:
import java.util.LinkedList;
import java.util.List;

public class Suchen {
    public static class MatchGroup {
        public String originalString;
        public int matchStartIndex;
        public int matchEndIndex;

        public MatchGroup(String originalString, int matchStartIndex, int matchEndIndex) {
            this.originalString = originalString;
            this.matchStartIndex = matchStartIndex;
            this.matchEndIndex = matchEndIndex;
        }

        public String substring() {
            return originalString.substring(matchStartIndex, matchEndIndex) + " (" + matchStartIndex + "," + matchEndIndexb + ")";
        }
    }

    public static List<MatchGroup> findeDreistelligeNummern(String string) {
        List<MatchGroup> groups = new LinkedList<>();
        for (int index = 0; index < string.length(); index++) {
            if (Character.isDigit(string.charAt(index))) {
                while (index < s.length() && string.charAt(index) == '0') {
                    index++;
                }
                if (index == string.length() || !Character.isDigit(string.charAt(index))) {
                    groups.add(new MatchGroup(string, index - 1, index));
                } else {
                    int endIndex = index + 1;
                    try {
                        while (endIndex < string.length() && Integer.parseInt(string.substring(index, endIndex)) < 1000) {
                            endIndex++;
                        }
                    } catch (NumberFormatException ignore) {
                    }
                    groups.add(new MatchGroup(s, index, endIndex - 1));
                    index = endIndex - 2;
                }
            }
        }
        return groups;
    }

    public static void main(String[] args) {
        findeDreistelligeNummern("00aj0sf001001hs000zfs1d2n34h678m9999f0")
                .stream()
                .map(MatchGroup::substring)
                .forEach(System.out::println);
    }
}

Auszerdem funktioniert das nicht richtig, es produziert bei mir folgende Ausgabe:

Code:
0 (1,2)
0 (4,5)
100 (9,12)
1 (12,13)
0 (17,18)
1 (21,22)
2 (23,24)
34 (25,27)
678 (28,31)
999 (32,35)
9 (35,36)
0 (37,38)

Desweiteren ist die Interpretation von "001001" fuer diese Aufgabe schwierig. Koennte jetzt "1" und "1" sein oder "100" und "1".
 

KonradN

Top Contributor
Hallo Tobias, schön, dass Du Dir wieder einen Account gemacht hast.

Generell kannst Du Deinen Code so schreiben wie Du willst. Wenn Du in einem Forum eine Antwort verfasst, dann ist es aber nun einmal so, dass:

a) Leute schauen ob dies z.B. die Anforderungen erfüllt.

b) Ggf. Code einem kurzen Review unterziehen. Und da gibt es dann konstruktive Kritik. Die kannst Du annehmen oder es auch sein lassen.

c) Leute sich überlegen, wie hilfreich so eine Antwort auch ist. Wie gross schätzt Du die Chance ein, dass der TE Deine Antwort als hilfreich erachtet? (Nein, dass will ich nicht diskutieren. Ich habe mir da meine Gedanken gemacht und habe da meine Sicht. Ich will das aber nicht diskutieren. Das ist eine reine Denkanregung.
 

yfons123

Bekanntes Mitglied
nummer("00aj0sf001001hs000zfs1d2n34h678m9999f0").stream().map(MatchGroup::substring).forEach(System.out::println);
nur weil man streams benutzt ist der code nicht unbedingt gut möchte ich mal an einer stelle anmerken

c# hat das gleiche als LINQ und sollte mit bedacht eingesetzt werden da man einfachen code nur so sehr verkompliziert nur um ihn in einer zu haben
 

KonradN

Top Contributor
Welche Anforderungen? Die Konradschen Namenskonventionen? Spielst du wieder Alleinherrscher?
Das überrascht mich jetzt doch etwas, denn ich dachte eigentlich, dass es in diesem Punkt bereits einen Konsens gegeben hätte:
Jo, ich bin davon ausgegangen, dass er Zahlen zwischen 0 und 999 ohne führende Nullen sucht. Das war vielleicht etwas zu viel in die Aufgabe hineininterpretiert.

Und bezüglich Clean Code bin ich nur ein kleines Licht. Ich plappere einfach nur nach, was Andere so erzählen, z.B. Uncle Bob. Solltest Du Dir evtl. auch einmal an tun. Das Thema Clean Code ist für Software Entwickler nun einmal sehr wichtig. (Ok, Du hast in der Vergangenheit oft gesagt, dass Du das eben nicht bist. Aber dann stellt sich die Frage, was Dich in dem Themengebiet denn dann zum Spezialisten macht - Deiner Meinung nach?)

Aber das ist nicht das Thema. Meine Position habe ich deutlich gemacht und ich denke, dass diese so auch verständlich ist. Daher muss das nicht weiter vertieft werden.
 

KonradN

Top Contributor
Sorry, aber das Thema war schlicht und einfach eine Bewertung von Code. Und da geht es auch durchaus um Clean Code. Und Du hast sinnloses Zeug gebrabbelt von wegen "Die Konradschen Namenskonventionen? Spielst du wieder Alleinherrscher?"

Daher habe ich einfach nur gesagt, woher Dinge kommen, die ich so von mir gebe - und da geht es nun einmal nicht um Regeln, die von mir stammen.

Ganz einfache Logik, nicht schwer zu verstehen. Aber vielleicht will der kleine Tobias auch einfach nur aus dem Bällespieleparadies abgeholt werden?
 

KonradN

Top Contributor
angemessenheit an das wissen des TEs spielte da aber keine rolle?
Das Thema Clean Code umfasst sowas natürlich auch (aus meiner Sicht). Man muss sich immer überlegen, wer denn in der Lage sein soll, den Code zu lesen. Je nachdem können dann mehr oder weniger Mittel eingesetzt werden. Aber das tritt im Forum eher in den Hintergrund. In #12 habe ich das ja versucht, das etwas darzustellen und da wäre es der Punkt c).

Aber das will ich eigentlich nicht weiter vertiefen. Meine Sichtweise habe ich darstellen können und ich denke, dass da nicht viel mehr zu sagen ist. Das kann dann ansonsten jeder so sehen, wie er möchte.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
J Eingabe des Scanners an einer bestimmten Position Java Basics - Anfänger-Themen 6
R Position einer Ziffer in einer Zahlenkette Java Basics - Anfänger-Themen 5
B aktuelle Position einer JTextArea ermitteln Java Basics - Anfänger-Themen 6
B Position einer Ziffer im String bestimmen Java Basics - Anfänger-Themen 4
T aktuelle Position in einer Datei Java Basics - Anfänger-Themen 4
I 2D-Array Position der Liste ausgeben. Java Basics - Anfänger-Themen 2
J Itext-Paragraph Position ändern Java Basics - Anfänger-Themen 13
B Berechnung der Position von Kinderelemente von einem Elternknoten Java Basics - Anfänger-Themen 23
J Eine Position im String durch einen Integer - Wert teilen Java Basics - Anfänger-Themen 5
J Java GUI- Objekte Position per Quelltext bestimmen Java Basics - Anfänger-Themen 4
S suche nach varible POSITION ... fuer das pixel-maennchen Java Basics - Anfänger-Themen 4
I Eigenschaften von Position aus anderer Klasse übernehmen Java Basics - Anfänger-Themen 17
Anica Processing Animation Bild-Position ändern Java Basics - Anfänger-Themen 9
H Position verschieben der Elemtente im Array Java Basics - Anfänger-Themen 3
S Position eines Frames Java Basics - Anfänger-Themen 3
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
T Arrayposition um eine Position verschieben Java Basics - Anfänger-Themen 2
V Klassen Bestimmen Sie die erste und letzte Position an der ein 'c' steht? Java Basics - Anfänger-Themen 3
V Datentypen Position mit Int und Float berechen und ausgeben Java Basics - Anfänger-Themen 5
Z Wie Position eines Objekts in Liste herausfinden? Java Basics - Anfänger-Themen 15
C Position eines Zeichens in einem String ausgeben Java Basics - Anfänger-Themen 1
J Buchstabe (char) an zufällige Position eines Strings einfügen Java Basics - Anfänger-Themen 1
C [Greasmonkey] Maus Coursor position setzen Java Basics - Anfänger-Themen 1
I Int Array, Zahl an bestimmte position setzten Java Basics - Anfänger-Themen 2
S Bild auf eine Position rotieren?! Java Basics - Anfänger-Themen 4
O Position des Buttons wird nicht geändert.. Java Basics - Anfänger-Themen 6
H Cursor-Position bei Rechtsclick? Java Basics - Anfänger-Themen 2
D 2 Fragen: Position ändern vs. LayoutManager / Bilder einfügen im Vordergrund Java Basics - Anfänger-Themen 3
S Maus Position Java Basics - Anfänger-Themen 6
A Eine Datei Lesen und bestimmte Position überschreiben Java Basics - Anfänger-Themen 2
S JSplitPane Divider Maximum Position Java Basics - Anfänger-Themen 5
W Position in ArrayList ermitteln Java Basics - Anfänger-Themen 4
M kurze frage: Ohne index.of position von string angeben Java Basics - Anfänger-Themen 16
M Input/Output position in temporären dateien kann nicht gesetzt werden Java Basics - Anfänger-Themen 3
E Y-Position der Maus nehmen Java Basics - Anfänger-Themen 5
R mit DefaultStyledDocument die Caret-Position ändern? Java Basics - Anfänger-Themen 5
V Position in einem Vektor Java Basics - Anfänger-Themen 3
M LinkedList aktuelle position Java Basics - Anfänger-Themen 3
E Position erkennen und überlappungen feststellen Java Basics - Anfänger-Themen 4
M Fixe Position von GUI Komponenten ? Java Basics - Anfänger-Themen 9
B JMenu Position bestimmen Java Basics - Anfänger-Themen 7
H B-Baum: Knoten Position als Parameter oder als Variable im Objekt? Java Basics - Anfänger-Themen 4
TheKing Spieler Position mit Array vergleichen Java Basics - Anfänger-Themen 2
T Image Position erkennen Java Basics - Anfänger-Themen 6
L die Position von Suchtreffern von Lucene finden Java Basics - Anfänger-Themen 2
S Datentypen In ArrayList nach Element suchen und Position ausgeben Java Basics - Anfänger-Themen 9
K Kreis mit neuer Position zeichnen Java Basics - Anfänger-Themen 3
S OOP Wie bei Spiel "17+4" eine Karte an bestimmte Position hinzufügen Java Basics - Anfänger-Themen 13
M Zufällige Position Java Basics - Anfänger-Themen 3
A Elemente 2er int[] auf Gleichheit und Position überprüfen Java Basics - Anfänger-Themen 7
M Position des BufferedReader Java Basics - Anfänger-Themen 6
J Programm-Fesnter Position Java Basics - Anfänger-Themen 4
O Maus / Pixel Position bei mir und bei anderen. Java Basics - Anfänger-Themen 8
F Position JTextField Java Basics - Anfänger-Themen 4
C Position eines Fensters bestimmen Java Basics - Anfänger-Themen 3
H problem mit button position Java Basics - Anfänger-Themen 4
G Bestimmte Position im array auslesen Java Basics - Anfänger-Themen 8
M Array, Int-wert Ziffer je Position zuweisen Java Basics - Anfänger-Themen 3
B String vom Server nach Position... (erledigt) Java Basics - Anfänger-Themen 6
H Exception: illegal component position Java Basics - Anfänger-Themen 5
G Position eines Objekts auf Webseite herausfinden Java Basics - Anfänger-Themen 9
hdi Grösse & Position von JScrollBar Java Basics - Anfänger-Themen 28
G TrayIcon: Wie aktuelle Position des Icons erhalten? Java Basics - Anfänger-Themen 2
D Fensterrahmen und Position ändern. Java Basics - Anfänger-Themen 5
M Maus position abfragen und setzen? Java Basics - Anfänger-Themen 1
G Position Java Basics - Anfänger-Themen 7
R Position in ArrayList ermitteln Java Basics - Anfänger-Themen 5
R Element an Position in ArrayList checken Java Basics - Anfänger-Themen 4
D Dateizugriff - An bestimmter Position Lesen (Random Access) Java Basics - Anfänger-Themen 2
H Finde Position Java Basics - Anfänger-Themen 4
J mouseover Text => Bildanzeige an bestimmter Position.Wie Java Basics - Anfänger-Themen 2
T Zeichen eines Strings an festgelegter Position einfügen Java Basics - Anfänger-Themen 8
J Jedes Element in 2 Arrays mit gleicher Position addieren Java Basics - Anfänger-Themen 12
C Absolute Cursor Position oder doch relative? Java Basics - Anfänger-Themen 4
L Gezielte Infos aus Datei holen - Suche nach Position/Wort Java Basics - Anfänger-Themen 22
M Servlet position bestimmen Java Basics - Anfänger-Themen 3
B String in ein RandomAccessFile einfügen (bestimmte Position) Java Basics - Anfänger-Themen 4
bernd An der Position des Cursors String einfügen Java Basics - Anfänger-Themen 11
C Position im Objekt-Stream Java Basics - Anfänger-Themen 2
G x-,y-position java-applet Java Basics - Anfänger-Themen 2
LilliCherry Array in einer Zeile ausgeben Java Basics - Anfänger-Themen 6
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
L Dauerhaftes Speichern einer Eingabe bei einer ArrayList Java Basics - Anfänger-Themen 26
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
stormyark Fehler beim überschreiben einer Variable Java Basics - Anfänger-Themen 1
H Kompliziertes Sortieren einer ArrayList mit Objekten(Sortieren nach X und Y) Java Basics - Anfänger-Themen 11
T Permanentes speichern von Objekten in einer ArrayList Java Basics - Anfänger-Themen 6
Saiko Zeilen einer Datei einlesen Java Basics - Anfänger-Themen 3
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
G zwei Instanzen einer Klasse Java Basics - Anfänger-Themen 29
sserio Prüfziffer einer ISBN Nummer herrausfinden. Java Basics - Anfänger-Themen 14
J Benennung einer mir unbekannten Java - Ausdrucksweise Java Basics - Anfänger-Themen 5
LFB In einer For-Schleife alles in einer Zeile ausgeben Java Basics - Anfänger-Themen 14
sserio Wie kann man nach einer Klasse fragen? Java Basics - Anfänger-Themen 12
berserkerdq2 Wann soll ich den Stream schließen, wenn ich das in einer Methode habe? Java Basics - Anfänger-Themen 8
berserkerdq2 Wie gebe ich den Pfad zu einer Datei an, die in einem Ordner in Eclipse ist? Java Basics - Anfänger-Themen 1
M Variable in einer Schleife initialisieren Java Basics - Anfänger-Themen 46
D EinMalEins mithilfe einer for-Schleife und Array Java Basics - Anfänger-Themen 1
J int innerhalb einer Datei ändern Java Basics - Anfänger-Themen 1

Ähnliche Java Themen


Oben