2012-03-20 8 views
77

Ive ha ottenuto la seguente if:Come verificare se una stringa inizia con uno dei vari prefissi?

String newStr4 = strr.split("2012")[0]; 
if(newStr4.startsWith("Mon")) 
str4.add(newStr4); 

voglio includere startsWith 'Mon' 'Mar' '' ecc 'novelli' Thru 'Venerdì' C'è un modo semplice per questo quando si utilizzano le stringhe? Ho provato '||' ma non ha funzionato ...

Grazie!

+4

Vuoi dire che si è tentato ' "Mon || Mar"', ecc? O hai usato 'newStr4.startsWith (" Mon ") || newStr4.startsWith (" Tues ") ...'? Ad ogni modo, si prega di definire "non ha funzionato". – Thomas

+0

Stai cercando di analizzare una data per caso? In tal caso, utilizzare SimpleDateFormat ... – Adam

risposta

132

vuoi dire:

if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues") || ...) 

o si potrebbe usare espressioni regolari:

if (newStr4.matches("(Mon|Tues|Wed|Thurs|Fri).*")) 
+2

C'è qualche differenza di prestazioni nei due metodi che hai suggerito? – TheCrazyProgrammer

+3

@ TheCrazyProgrammer Ovviamente c'è; la corrispondenza tramite espressioni regolari è molto più costosa rispetto alle chiamate al metodo stringa raw. Figure esatte che non posso dare, ma questo è il consenso generale. – klaar

7

Una soluzione semplice è:

if (newStr4.startsWith("Mon") || newStr4.startsWith("Tue") || newStr4.startsWith("Wed")) 
// ... you get the idea ... 

Una soluzione più elegante sarebbe:

List<String> days = Arrays.asList("SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"); 
String day = newStr4.substring(0, 3).toUpperCase(); 
if (days.contains(day)) { 
    // ... 
} 
+3

Oppure [Arrays.binarySearch()] (http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#binarySearch%28java.lang.Object [],% 20java.lang.Object% 29) se l'elenco di ricerca è ordinato: D –

+1

@BrendanLungo un po 'di overkill per una lista così breve, ma ok :) –

1
if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues") || newStr4.startsWith("Weds") .. etc) 

è necessario includere l'intero str.startsWith(otherStr) per ogni elemento, dal momento che || funziona solo con espressioni booleane (vero o falso).

Ci sono altre opzioni se hai un sacco di cose da controllare, come regular expressions, ma tendono ad essere più lente e le espressioni regolari più complicate sono generalmente più difficili da leggere.

Un esempio di espressione regolare per il rilevamento onomastico abbreviazioni sarebbe:

if(Pattern.matches("Mon|Tues|Wed|Thurs|Fri", stringToCheck)) { 
0

Quando si dice si è tentato di utilizzare o, esattamente come hai provato e usarlo? Nel tuo caso, ciò che sarà necessario fare sarebbe qualcosa in questo modo:

String newStr4 = strr.split("2012")[0]; 
if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues")...) 
str4.add(newStr4); 
36

Oltre al soluzioni già presentate, è possibile utilizzare la libreria Apache Commons Lang:

if(StringUtils.startsWithAny(newStr4, new String[] {"Mon","Tues",...})) { 
    //whatever 
} 
3

Ovviamente, sii consapevole che il tuo programma sarà utile solo nei paesi di lingua inglese se rilevi date in questo modo. Si potrebbe prendere in considerazione:

Set<String> dayNames = Calendar.getInstance() 
.getDisplayNames(Calendar.DAY_OF_WEEK, 
     Calendar.SHORT, 
     Locale.getDefault()) 
.keySet(); 

Da qui è possibile utilizzare .startsWith o .matches o qualsiasi altro metodo che altri hanno già detto. In questo modo ottieni le impostazioni internazionali predefinite per jvm. Potresti sempre passare nelle impostazioni locali (e magari impostarle di default nelle impostazioni internazionali del sistema se sono nulle) per essere più robuste.

14

nessuno ha menzionato Stream finora, ecco che è:

if (Stream.of("Mon", "Tues", "Wed", "Thurs", "Fri").anyMatch(s -> newStr4.startsWith(s))) 
+3

risposta grande (e aggiornata) ... btw 's -> newStr4.startsWith (s)' può essere sostituito da 'newStr7 :: startsWith' per essere più chiaro –

+0

Come posso ignorare qui? – happybuddha

Problemi correlati