Filtern einer 3stelligen Zahl

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Guten Morgen zusammen,

genau genommen habe ich hier kein Problem, sondern möchte eher wissen welche meiner gefundenen Möglichkeiten die besser ist. Sollte jemand ne ganz andere Lösung haben lasse ich aber natürlich auch gerne belehren! 😀

Also es ist so, dass ich einen 3stelligen String bekomme, der eine Zahl zwischen 1 und 999 enthalten kann. Ich brauche jetzt eine Prüfmethode, die FALSE zurück gibt, wenn die Zahl zwischen x70 und x94 liegt. Ansonsten soll die Methode TRUE zurück geben.

Meine Ansätze:

1a) String#endsWith("70") ..... und das ganze (also 24 mal) mit oder in einem if
1b) String#endsWith("70") ..... und das jeweils in einem if (also 24 mal if)

Die beiden Möglichkeiten halte ich auf Grund der String-Operationen allerdings für langsamer als Arbeiten mit int-Werten

2) String#endsWith([7-9][0-4])

Bin mir nicht sicher, ob Regex hier so passt (bin noch nicht dazu gekommen es auszuprobieren) aber wäre denke ich evtl. eine Möglichkeit

3a) Aus dem String einen int erzeugen, (int > 69 && int < 95) ... und diesen Ausdruck für jeden Bereich (nächster wäre >169 && < 195 usw.) - Das ganze in einem if
3b) Wie 3a, nur für jeden Bereich ein if

Wäre evtl. möglich aber trotzdem viele if-Abfragen

4) Aus dem String einen int erzeugen und das Ganze in Switch-Case abhandeln

Grundsätzlich würde ich schätzen, dass die Regex-Methode wohl die "beste" wäre, oder ich alternativ dann mit Switch-Case arbeiten sollte, weil die vielen if-Abfragen mit Strings oder ints sind denke ich mal schon langsamer bzw. resourcen-verbrauchender als Methode 2 oder 4, oder? :bahnhof:

Ich denke eigentlich wäre es mit allen Lösungen machbar, bin mir aber nicht sicher welche davon die beste ist, bzw. ob alle so überhaupt richtig funktionieren würden! 🙂

Also helft mir!! 😀

Vielen Dank schon mal für eure Mühen!!![/quote]
 
Sry hab da bei meinem regulären Ausdruck was falsch, müsste natürlich sein:

String#matches(\d[7-9][0-4])
 
Zu 3a): Warum die ganze Zahl in einen int umwandeln und nicht nur die jeweils letzten beiden Stellen? Dann resultiert das Ganze in einer if-Abfrage mit einer &&-Verknüpfung.
 
erstmal prüfen, ob drei Ziffern vorhanden sind (1 hat nur eine),
die letzten beiden Ziffern dann parsen oder schneller per Hand unwandelt:
int x= (charAt(1)-'0')*10+(charAt(2)-'0');
if ( 70 <= x && x <= 94)
 
Als erstes mal VIELEN DANK für eure Antworten.

So, wie man sieht, sah ich den Wald vor lauter Bäumen mal wieder nicht! :autsch:

Der String kommt übrigens immer 3stellig und enthält nur Ziffern.

Code:
int x= (charAt(1)-'0')*10+(charAt(2)-'0'); 
if ( 70 <= x && x <= 94)

Sollte also ohne Probleme gehen. Dank euch hat sich meine "Auswahlmöglichkeit" jetzt dann eigentlich auf 2 Möglichkeiten beschränkt. Zum einen, die von euch vorgeschlagene Lösung (wie von SlaterB ausformuliert - siehe oben), oder Regex.

Code:
myString.matches([0-9][7-9][0-4])

Die Operationen mit ints könnten denke ich grundsätzlich schneller sein, allerdings kann ich mit Stirng#matches(String) das Ganze in einer Zeile abhandeln und direkt den Rückgabewert von matches auch als meinen Methodenrückgabewert (gedreht) verwenden.

Welche der beiden Möglichkeiten ist eurer Meinung nach jetzt die "bessere"?

Vielen Dank schon wieder mal im Voraus! 😀
 
Schon mal an modulo gedacht? Also mir scheint folgendes am einfachsten...

Code:
  boolean testString(String myString)
  {
    int myInt = Integer.parseInt(myString) % 100;
    return (myInt >=70 && myInt<=94);
  }
 
> myString.matches([0-9][7-9][0-4])

was ist denn mit 289?

allgemein:
schöner ist langsamer, auch das von Kim Stebel,
musst selber entscheiden was du haben willst
 
SlaterB hat gesagt.:
> myString.matches([0-9][7-9][0-4])

was ist denn mit 289?

allgemein:
schöner ist langsamer, auch das von Kim Stebel,
musst selber entscheiden was du haben willst

OK, voll erwischt, das geht so nicht! 😀

Dann werde ich mal schauen und auswüfeln ob mit charAt und int oder Modulo ! 🙂

Danke euch für die große Hilfe!!!!! :toll:
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben