Come faccio ad avere i primi n caratteri di una stringa senza controllare il formato o andare fuori dai limiti?

StackOverflow https://stackoverflow.com/questions/1583940

Domanda

Come faccio ad avere fino ai primi caratteri n di una stringa in Java senza fare un controllo di dimensioni prima (in linea è accettabile) o di rischiare una IndexOutOfBoundsException?

È stato utile?

Soluzione

Ecco una soluzione chiara:

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

Opinione: mentre questa soluzione è "pulito", credo che in realtà è meno leggibile di una soluzione che utilizza if / else in modo ovvio. Se il lettore non ha visto questo trucco, lui / lei deve pensare più difficile per capire il codice. IMO, il significato del codice è più evidente nella versione if / else. Per una / soluzione più leggibile pulita, vedere @ risposta di paxdiablo.

Altri suggerimenti

Non reinventare la ruota ...:

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

Javadoc dice:

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"

In questo modo:

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

Apache Commons Lang ha una metodo StringUtils.left per questo.

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

C'è una classe di domanda, in modo che a volte rendono meno di un senso perfetto, questo è pericolosamente vicino: -)

Forse si potrebbe spiegare la sua avversione per utilizzando uno dei due metodi che è esclusa.

Se è solo perché non si vuole il pepe il codice con dichiarazioni if o eccezione codice cattura, una soluzione è quella di utilizzare una funzione di supporto che si prenderà cura di esso per voi, qualcosa di simile a:

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

che controllerà lunghezze anticipo ed agire di conseguenza (o di ritorno stringa più piccola o pad con spazi).

Quindi non dovete preoccuparvi di questo nel codice a tutti, basta chiamare:

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

invece che:

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

Questo potrebbe funzionare nel caso in cui ti sembra di essere preoccupati (in base ai vostri commenti a altre risposte), non rompendo il flusso del codice quando si fa un sacco di roba costruzione di stringa.

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

terribile se n è una variabile (quindi è necessario costruire la stringa di formato), ma abbastanza chiaro se una costante:

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

docs

Utilizzare il metodo stringa, come segue:

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

Se n è maggiore della lunghezza della stringa, questa un'eccezione, come un commentatore ha sottolineato. una soluzione semplice è quella di avvolgere tutto questo nella condizione if(s.length()<n) nella clausola else, è possibile scegliere se si desidera solo per stampare / restituire la stringa intera o gestire in altro modo.

Se si ha la fortuna di sviluppare con Kotlin,
è possibile utilizzare take per raggiungere il tuo obiettivo.

val someString = "hello"

someString.take(10) // result is "hello"
someString.take(4) // result is "hell" )))

ApacheCommons mi ha sorpreso, StringUtils.abbreviate(String str, int maxWidth) aggiunge "..." non v'è alcuna possibilità di cambiare postfix. WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd) alza lo sguardo al prossimo spazio vuoto.

Sto solo andando a lasciare questo qui:

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top