Come ottengo i primi n caratteri di una stringa senza controllare le dimensioni o andare fuori limite?

Come posso ottenere fino ai primi n caratteri di una stringa in Java senza prima eseguire un controllo della dimensione (in linea è accettabile) o rischiare un IndexOutOfBoundsException ?

Ecco una soluzione chiara:

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

Opinione: mentre questa soluzione è “pulita”, penso che sia effettivamente 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 a capire il codice. IMO, il significato del codice è più evidente nella versione if / else . Per una soluzione più pulita / più leggibile, vedere la risposta di @ paxdiablo.

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" 

Così:

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

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

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

C’è una class di domande su SO che a volte non ha senso perfettamente, questo è pericolosamente vicino 🙂

Forse potresti spiegare la tua avversione all’uso di uno dei due metodi che hai escluso.

Se è solo perché non vuoi aggiungere il tuo codice con istruzioni if o codice di eccezione, una soluzione è usare una funzione di supporto che si prenderà cura di te per te, qualcosa del tipo:

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

che controllerà le lunghezze in anticipo e agirà di conseguenza (o restituirà una stringa più piccola o un pad con spazi).

Quindi non devi preoccuparti di questo nel tuo codice, basta chiamare:

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

invece di:

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

Ciò funzionerebbe nel caso in cui sembri essere preoccupato (basato sui tuoi commenti ad altre risposte), non infrangendo il stream del codice quando si fa un sacco di roba da costruzione di stringhe.

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

Terribile se n è una variabile (quindi devi build la stringa di formato), ma piuttosto chiara se una costante:

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

docs

Utilizzare il metodo della sottostringa, come segue:

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

Se n è maggiore della lunghezza della stringa, verrà generata un’eccezione, come indicato da un commentatore. una soluzione semplice è di avvolgere tutto questo nella condizione if(s.length() nella tua clausola else , puoi scegliere se vuoi solo stampare / restituire l'intera stringa o gestirla in un altro modo.

StringUtils.abbreviate(String str, int maxWidth) mi ha sorpreso, StringUtils.abbreviate(String str, int maxWidth) aggiunge “…” non c’è alcuna opzione per cambiare postfix. WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd) guarda al prossimo spazio vuoto.

Sto per 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; }