2012-05-14 12 views
6

que necesito la lógica de código para el siguiente:Únete cuerdas con un separador y pelar las vacías

Estas son las variables de tres cuerdas,

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

necesito tener las siguientes salidas en base a lo dado escenarios:

  • Escenario # 1 de salida real debe ser "A/B/C"
  • Escenario # 2 Cuando s1 está vacía, la salida debe ser "B/C"
  • Escenario # 3 Cuando s2 está vacía, la salida debe ser "A/C"
  • Escenario # 4 Cuando s3 está vacía, la salida debe ser "A/B"`

¿Es esta posible utilizando la operación ternaria?

+2

Por supuesto que sí, pero no es lo que creo que es mucho más fácil de leer usando "normal" si las declaraciones? Quiero decir: conoces al operador ternario, pero para usarlo en cascada no está claro para ti, será menos claro para quién leerá tu código. –

+0

¿qué hay de los otros cuatro escenarios? ¿Son posibles también? – Alnitak

+0

Sí, es posible. Sin embargo, no usaría el operador ternario para esto. – NPE

Respuesta

1

que puede hacer:

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

See it

+0

+1 por hacerlo de la manera más inteligente y no dictar el asker – oksayt

+0

con 's1 =" A "', 's2 =" B "' y 's3 = null', obtiene' A/B/'que es incorrecto. –

+0

Está mal. Los separadores deben estar condicionados al resultado anterior, que o bien requiere declaraciones separadas/o las últimas condiciones ternarias para verificar todos los términos anteriores. –

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

¡no sugerirán usarlo! ¡¡demasiado ilegible !!

+0

Estoy de acuerdo con usted acerca de la legibilidad. Se volverá aún más ilegible una vez que comiences a buscar la cadena vacía en lugar de 'nulo', y una vez que comiences a concatenar cadenas de entrada reales en lugar de codificar' 'A/B" 'etc. – NPE

+1

Sospecho que esto es tarea, que encuentro parece requerir que a veces generemos código ilegible. –

+0

acaba de editarlo !!!!! – WickeD

2

Ésta no es una respuesta verdadera, porque no voy a utilizar aquí el operador ternario.

Si necesita para concatenar cadenas eliminar los vacíos de poder escribir una función genérica (sin comprobación de errores, sin optimizaciones, tomarlo como un ejemplo):

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(); 
} 

Es bastante más larga que la "línea" versión, pero funciona independientemente del número de cadenas que desee unir (y puede cambiarlo para usar una cantidad variable de parámetros). Hará que el código donde lo va a usar sea mucho más claro que cualquier tipo de árbol if.

Algo como esto:

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

Gracias por la respuesta. Pero el '/' no deseado también debe eliminarse para cada escenario. Por ejemplo, si s2 está vacío, la salida debe ser "A/C" y no "A// C". lo mismo para el otro escenario si s1 está vacío, o/p debería ser "B/C" no "/ B/C". Todavía necesita demasiadas líneas de código ¿eh? :) – Marshal

+0

@Marshal sí, actualizó la respuesta para manejar eso. Sí, muchas más líneas de código pero 99.9999% veces el punto no es si el código es largo o no, pero si es legible, reutilizable y no propenso a errores. De todos modos, esto no fue para responder a su pregunta sino para proporcionar un ejemplo de la función _join_ para cadenas. :) –

+1

Gracias Adriano !!! Esto es lo que esperaba. – Marshal

10

Usted puede hacerlo con la ayuda de la clase de guayaba Joiner y Apache Commons Lang StringUtils.defaultIfBlank:

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

Puede extraer las tres líneas de " defaultIfBlank "en un método con un bucle si necesita procesar un número arbitrario de cadenas.

+0

En la primera lectura, supervisé completamente el ".skipNulls()", que es oro aquí. Ni siquiera sabía su existencia todavía. Súper fácil con algo "skippable" :) – BAER

+0

O use 'Strings.emptyToNull' de Guava en lugar de' defaultIfBlank' si solo quiere usar la biblioteca de Guava. –

3

Un java8 vías con una corriente

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