Wie erhalte ich die ersten n Zeichen einer Zeichenfolge, ohne die Größe zu überprüfen oder die Grenzen zu überschreiten?

Lesezeit: 6 Minuten

Benutzer-Avatar
antony.trupe

Wie komme ich zum ersten n Zeichen einer Zeichenfolge in Java, ohne zuerst eine Größenprüfung durchzuführen (Inline ist akzeptabel) oder eine zu riskieren IndexOutOfBoundsException?

  • Wenn Sie die Ausnahme nicht abfangen, weiß ich nicht, wie Sie mit dem Fall umgehen möchten, in dem die Zeichenlänge größer als die Zeichenfolgenlänge ist.

    – Matt Böhm

    18. Oktober 2009 um 3:52 Uhr

  • Wieso den? Was ist Ihre Abneigung gegen die Überprüfung der Länge oder das Abfangen einer Ausnahme?

    – paxdiablo

    18. Oktober 2009 um 3:57 Uhr

  • Aus reiner Neugier, warum wollen Sie die Größenprüfung vermeiden? Das ist nicht C.

    – Tom Hawtin – Angelleine

    18. Oktober 2009 um 3:59 Uhr

  • Was ich ausdrücken wollte, war der Wunsch, einen if/else-Block zu vermeiden, nicht eine Abneigung gegen die tatsächliche Überprüfung der Länge.

    – antony.trupe

    18. Oktober 2009 um 4:22 Uhr

  • potenzielles Duplikat von: stackoverflow.com/questions/8499698/…

    – Wunderlich

    12. Februar 2019 um 23:37 Uhr

Benutzer-Avatar
Stefan C

Hier ist eine nette Lösung:

String upToNCharacters = s.substring(0, Math.min(s.length(), n));

Meinung: Obwohl diese Lösung “sauber” ist, denke ich, dass sie es tatsächlich ist weniger lesbar als eine Lösung, die verwendet if / else auf die offensichtliche Weise. Wenn der Leser diesen Trick nicht gesehen hat, muss er es tun denke härter nach um den Code zu verstehen. IMO, die Bedeutung des Codes ist in der offensichtlicher if / else Ausführung. Eine sauberere/lesbarere Lösung finden Sie in der Antwort von @paxdiablo.

  • +1. Noch besser, wenn dies in eine Funktion namens safe_substring oder substring_safe verpackt ist, wie die Antwort von paxdiablo, damit die Verwendung einfacher zu lesen / die Absicht offensichtlicher ist.

    – WerkzeugmacherSteve

    20. August 2014 um 5:17 Uhr


  • Ich bin mit dem, was Sie sagen, nicht einverstanden. Wenn dies in eine Funktion verpackt ist, Es spielt keine Rolle, was in der Funktion enthalten ist, und jede “Ordnung” wird definitiv durch mangelnde Klarheit aufgewogen. Der Punkt dieser Lösung ist, dass sie für den Fall “ordentlich” ist, wo Sie nicht möchte eine Wrapper-Funktion erstellen.

    – Stefan C

    19. Juni 2018 um 11:42 Uhr

  • Es wäre sauberer, StringUtils zu verwenden. Es verhindert sowohl IndexOutOfBoundsException als auch NullPointerException.

    – Luis Martinez

    19. Mai 2021 um 15:02 Uhr

  • Ich bin nicht davon überzeugt, dass die Verhinderung von NPEs eine gute Sache ist. Eine NPE bedeutet, dass Sie eine haben sollten null in s. Es ist ein Zeichen für einen Fehler, nicht etwas, das versteckt werden sollte. Umgang mit A null ist nicht Teil der angegebenen Anforderungen des OP.

    – Stefan C

    20. Mai 2021 um 7:50 Uhr


Benutzer-Avatar
Nickkk

Das Rad nicht neu erfinden…:

org.apache.commons.lang.StringUtils.substring(String s, int start, int len)

Javadoc sagt:

StringUtils.substring(null, *, *)    = null
StringUtils.substring("", * ,  *)    = "";
StringUtils.substring("abc", 0, 2)   = "ab"
StringUtils.substring("abc", 2, 0)   = ""
StringUtils.substring("abc", 2, 4)   = "c"
StringUtils.substring("abc", 4, 6)   = ""
StringUtils.substring("abc", 2, 2)   = ""
StringUtils.substring("abc", -2, -1) = "b"
StringUtils.substring("abc", -4, 2)  = "ab"

Daher:

StringUtils.substring("abc", 0, 4) = "abc"

  • Es beantwortet die Frage nicht, liefert aber trotzdem die Lösung. Wenn das OP verstehen kann, denke ich, dass dies eine bessere Lösung ist.

    – aullah

    9. März 2014 um 23:43 Uhr

  • Es kann auch sinnvoll sein, darauf hinzuweisen StringUtils.substring(yourString, 0, n) ist nicht dasselbe wie yourString.substring(0, n). Ersteres ist von StringUtilswährend letzteres verwendet wird String.substring (was eine Ausnahme gibt, wenn der Endindex die Länge der Zeichenfolge überschreitet).

    – WerkzeugmacherSteve

    20. August 2014 um 4:59 Uhr


  • Genauso zu Ihrer Information, wenn Sie in der Quelle nach dieser Methode suchen, wird der Fall behandelt, in dem das Ende größer als die Länge ist, indem das Ende in die Länge geändert wird: if (end > str.length()) { end = str.length();}

    – boll

    5. April 2017 um 19:14 Uhr


  • Der letzte Parameter von StringUtils.substring(String s, int start, int len) ist nicht len, sondern der end-Index.

    – gorootde

    10. April 2017 um 10:27 Uhr

  • StringUtils.substring(“abc”, 0, 4) = “abc”, hat bei mir funktioniert. Vielen Dank !

    – Akash5288

    24. September 2018 um 8:58 Uhr

Benutzer-Avatar
Skuli

Apache Commons Lang hat ein StringUtils.left Methode dazu.

String upToNCharacters = StringUtils.left(s, n);

  • Sollte das nicht die beste Lösung sein? Warum stimmen nicht viele dafür?

    – Wille tun

    24. Juli 2018 um 13:46 Uhr

  • Vielleicht, weil andere nicht der gleichen Meinung sind wie du? 🙂

    – Stefan C

    25. Juli 2018 um 7:51 Uhr

  • Diese Antwort kam viel später als das ursprüngliche Fragestellungsdatum.

    – Wunderlich

    12. Februar 2019 um 23:36 Uhr

  • @DoWill: Weil es sich nicht immer lohnt, Ihrer ausführbaren Umgebung eine (andere) Bibliothek eines Drittanbieters hinzuzufügen.

    – LarsH

    28. Oktober 2019 um 16:08 Uhr


  • @LarsH Aber Apache Commons, wie es bevölkert ist, war bereits in vielen vielen Projekten enthalten. Es würde nicht noch eine weitere Bibliothek von Drittanbietern für teilweises String-Slicing hinzugefügt werden.

    – tsch

    28. Juli 2021 um 7:53 Uhr

Benutzer-Avatar
13ren

String upToNCharacters = String.format("%."+ n +"s", str);

Schrecklich wenn n ist eine Variable (also müssen Sie den Formatstring konstruieren), aber ziemlich klar, wenn es sich um eine Konstante handelt:

String upToNCharacters = String.format("%.10s", str);

Dokumente

Benutzer-Avatar
paxdiablo

Es gibt eine Klasse von Fragen zu SO, die manchmal nicht ganz sinnvoll sind, diese ist gefährlich nah 🙂

Vielleicht könnten Sie Ihre Abneigung gegen eine der beiden ausgeschlossenen Methoden erklären.

Wenn es nur daran liegt, dass Sie Ihren Code nicht mit pfeffern möchten if Anweisungen oder Code zum Abfangen von Ausnahmen, eine Lösung besteht darin, eine Hilfsfunktion zu verwenden, die sich für Sie darum kümmert, etwa so:

static String substring_safe (String s, int start, int len) { ... }

die die Längen vorher prüft und entsprechend handelt (entweder kleinere Zeichenfolge zurückgeben oder mit Leerzeichen auffüllen).

Dann brauchen Sie sich in Ihrem Code überhaupt nicht darum zu kümmern, rufen Sie einfach auf:

String s2 = substring_safe (s, 10, 7);

Anstatt von:

String s2 = s.substring (10,7);

Dies würde in dem Fall funktionieren, dass Sie sich Sorgen zu machen scheinen (basierend auf Ihren Kommentaren zu anderen Antworten), den Fluss des Codes nicht zu unterbrechen, wenn Sie viele Zeichenfolgen erstellen.

  • +1: Dies ist ein VIEL besserer Ansatz als der akzeptierte, da OP den Code nicht überladen möchte. (oder sehen Sie sich Nickkks Lösung an, eine Bibliothek einzubinden, die bereits eine Funktion hat, die sich wie gewünscht verhält.)

    – WerkzeugmacherSteve

    20. August 2014 um 5:04 Uhr


Verwenden Sie die Substring-Methode wie folgt:

int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);

Wenn n größer als die Länge der Zeichenfolge ist, wird dies eine Ausnahme auslösen, wie ein Kommentator darauf hingewiesen hat. Eine einfache Lösung besteht darin, all dies in die Bedingung einzupacken if(s.length()<n) in deiner else -Klausel können Sie wählen, ob Sie nur den gesamten String drucken/zurückgeben oder auf andere Weise behandeln möchten.

  • +1: Dies ist ein VIEL besserer Ansatz als der akzeptierte, da OP den Code nicht überladen möchte. (oder sehen Sie sich Nickkks Lösung an, eine Bibliothek einzubinden, die bereits eine Funktion hat, die sich wie gewünscht verhält.)

    – WerkzeugmacherSteve

    20. August 2014 um 5:04 Uhr


ApacheCommons hat mich überrascht,
StringUtils.abbreviate(String str, int maxWidth) “…” anhängt, gibt es keine Möglichkeit, Postfix zu ändern.
WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd) schaut nach oben zum nächsten freien Platz.

Ich lasse das hier einfach stehen:

public static String abbreviate(String s, int maxLength, String appendToEnd) {
    String result = s;
    appendToEnd = appendToEnd == null ? "" : appendToEnd;
    if (maxLength >= appendToEnd.length()) {
        if (s.length()>maxLength) {
            result = s.substring(0, Math.min(s.length(), maxLength - appendToEnd.length())) + appendToEnd;
        }
    } else {
        throw new StringIndexOutOfBoundsException("maxLength can not be smaller than appendToEnd parameter length.");
    }
    return result;
}

  • @VolkanGüven Das liegt an diesem Satz “ApacheCommons hat mich überrascht”. Ich habe eine Sünde begangen, indem ich die heilige ApacheCommons-Bibliothek kritisiert habe. Oder Wasauchimmer…

    – yuceel

    11. Oktober 2018 um 14:35 Uhr


1352490cookie-checkWie erhalte ich die ersten n Zeichen einer Zeichenfolge, ohne die Größe zu überprüfen oder die Grenzen zu überschreiten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy