2012-05-14 9 views
6

ho bisogno la logica codice per il seguente:Partecipa stringhe con un separatore e strippaggio vuote

Queste sono le variabili tre stringa,

String s1 = "A"; String s2 = "B"; String s3 = "C"; 

devo avere le seguenti uscite in base alla data scenari:

  • Scenario # 1 uscita effettiva dovrebbe essere "A/B/C"
  • Scenario # 2 Quando s1 è vuota, uscita dovrebbe essere "B/C"
  • Scenario # 3 Quando S2 è vuota, l'uscita dovrebbe essere "A/C"
  • Scenario # 4 Quando S3 è vuota, l'uscita dovrebbe essere "A/B"`

È questo possibile usare l'operazione ternaria?

+2

Naturalmente sì, ma non pensi che è molto più facile da leggere con "plain" if? Voglio dire: conosci l'operatore ternario ma per utilizzarlo a cascata non è chiaro per te, quindi sarà meno chiaro per chi leggerà il tuo codice. –

+0

E gli altri quattro scenari? Sono possibili anche loro? – Alnitak

+0

Sì, è possibile. Tuttavia, non userei l'operatore ternario per questo. – NPE

risposta

1

si può fare:

result = ((s1==null)?"":(s1+"/"))+((s2==null)?"":(s2+"/"))+((s3==null)?"":s3); 

See it

+0

+1 per farlo in modo intelligente e senza dare una lezione al richiedente – oksayt

+0

con 's1 =" A "', 's2 =" B "' e 's3 = null', ottieni' A/B/'che non è corretto. –

+0

È sbagliato. I separatori devono essere condizionati sul risultato precedente, che richiede istruzioni separate o le condizioni ternarie successive per controllare tutti i termini precedenti. –

0
String ans = (s1 == null ? s2 + "/" + s3 : (s2 == null ? s1 + "/" + s3 : (s3 == null ? s1 + "/" + s2 : s1 + "/"+ s2 + "/" + s3))); 

non suggerire l'utilizzo però !! troppo illeggibile !!

+0

Sono d'accordo con te sulla leggibilità. Diventerà ancora più illeggibile una volta avviato il controllo della stringa vuota anziché di 'null', e una volta che avvierai concatenazione di stringhe di input reali piuttosto che hard-coding' "A/B" 'ecc. – NPE

+1

Sospetto che questo sia compito, che trovo sembra richiedere che a volte produciamo codice illeggibile. –

+0

lo hai appena modificato !!!!! – WickeD

2

Questa non è una vera risposta, perché io non uso qui l'operatore ternario.

Se è necessario concatenare le stringhe di rimuovere i vuoti è possibile scrivere una funzione generica (senza controllo degli errori, nessuna ottimizzazione, la prenda come esempio):

public static String join(String[] array, char separator) { 
    StringBuffer result = new StringBuffer(); 

    for (int i = 0; i < array.length; ++i) { 
     if (array[i] != null && array[i].length() != 0) { 
      if (result.length() > 0) 
       result.append(separator); 

      result.append(array[i]); 
     } 
    } 

    return result.toString(); 
} 

E 'piuttosto più lungo della "linea" versione ma funziona indipendentemente dal numero di stringhe che si desidera unire (e si può cambiare per usare un numero variabile di parametri). Renderà il codice dove lo userai molto più chiaro di qualsiasi tipo di albero if.

Qualcosa di simile a questo:

public static String join(char separator, String... items,) { 
    StringBuffer result = new StringBuffer(); 

    for (String item: items) { 
     if (item != null && item.length() != 0) { 
      if (result.length() > 0) 
       result.append(separator); 

      result.append(item); 
     } 
    } 

    return result.toString(); 
} 
+0

Grazie per la risposta. Ma anche il "/" non voluto dovrebbe essere rimosso per ogni scenario. Ad esempio, se s2 è vuoto, l'output dovrebbe essere "A/C" e non "A// C". lo stesso vale per l'altro scenario se s1 è vuoto, o/p dovrebbe essere "B/C" non "/ B/C". Hai ancora bisogno di troppe righe di codice eh? :) – Marshal

+0

@Marshal sì, ha aggiornato la risposta per gestirlo. Sì, molte più righe di codice ma il 99,999% volte il punto non è se il codice è lungo o meno, ma se è leggibile, riutilizzabile e non soggetto a errori. Ad ogni modo questo non era inteso per rispondere alla tua domanda ma per fornire un esempio di funzione _join_ per stringhe! :) –

+1

Grazie Adriano !!! Questo è quello che mi aspettavo. – Marshal

10

si può fare con con l'aiuto della classe di Guava Joiner e Apache Commons Lang StringUtils.defaultIfBlank:

Joiner.on("/").skipNulls().join(
    defaultIfBlank(s1, null), 
    defaultIfBlank(s2, null), 
    defaultIfBlank(s3, null) 
); 

è possibile estrarre le tre linee di " defaultIfBlank "in un metodo con un ciclo se è necessario elaborare un numero arbitrario di stringhe.

+0

In prima lettura ho supervisionato completamente il ".skipNulls()" che qui è d'oro. Non sapeva ancora la sua esistenza ancora. Super facile con qualcosa "ignorabile" :) – BAER

+0

Oppure usa 'Strings.emptyToNull' di Guava invece di' defaultIfBlank' se vuoi solo usare la libreria Guava. –

3

Un java8 vie con un flusso

Arrays.stream(new String[]{null, "", "word1", "", "word2", null, "word3", "", null}) 
    .filter(x -> x != null && x.length() > 0) 
    .collect(Collectors.joining(" - ")); 
Problemi correlati