2011-07-28 8 views
10

Duplicar posible:
If/Else vs. SwitchMejor: caja de conmutadores o if-else?

Tengo dos códigos aquí, sólo quería preguntar cuál de los dos es mejor en términos de capacidad de escritura (facilidad de escribir los códigos) y en términos de legibilidad (facilidad de comprensión de los códigos).

switch de los casos:

import java.io.*; 

public class Quarter{ 
    public static void main(String[] args){ 
     int day; 
     String input=""; 

     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 

     System.out.print("Input a number from 1 to 3: "); 

     try{ 
      input=in.readLine(); 
     }catch(IOException e){ 
      System.out.println("Error!"); 
     } 
     day=Integer.parseInt(input); 

     switch(day){ 
      case 1: 
      case 2: 
      case 3: 
       System.out.println("1st Quarter"); 
       break; 
      case 4: 
      case 5: 
      case 6: 
       System.out.println("2nd Quarter"); 
       break; 
      case 7: 
      case 8: 
      case 9: 
      System.out.println("3rd Quarter"); 
      break; 
      case 10: 
      case 11: 
      case 12: 
       System.out.println("4th Quarter"); 
       break; 
      default: System.out.println("Error!"); 
     } 

    } 
} 

if-else:

import java.io.*; 

public class Days{ 
    public static void main(String[] args){ 
     int day; 
     String input=""; 

     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 

     System.out.print("Input a number from 1 to 12: "); 

     try{ 
      input=in.readLine(); 
     }catch(IOException e){ 
      System.out.println("Error!"); 
     } 
     day=Integer.parseInt(input); 

     if(day>=1 && day<=3){ 
      System.out.println("1st Quarter"); 
     }else 
     if(day>=4 && day<=6){ 
      System.out.println("2nd Quarter"); 
     }else 
     if(day>=7 && day<=9){ 
      System.out.println("3rd Quarter"); 
     }else 
     if(day>=10 && day<=12){ 
      System.out.println("4th Quarter"); 
     }else 
      System.out.println("Error!"); 
    } 
} 
+0

No es un duplicado, ya que es para C# y esto es Java por lo que los buscadores de Java no encontrarían el original – Mark

+0

me he dado cuenta de un buen número de preguntas que piden lo mismo, pero para un idioma diferente. ¿Tal vez alguien debería hacer una pregunta wiki de la comunidad y tener una respuesta que cubra la pregunta para cada idioma? – Wipqozn

Respuesta

36

Ni, lo haría éste:

String[] out = { 
    "1st Quarter", 
    "2nd Quarter", 
    "3rd Quarter", 
    "4th Quarter" 
}; 

if (1 <= day && day <= 12) { 
    System.out.println(out[(day - 1)/3]); 
} else { 
    System.out.println("Error!"); 
} 
+2

Acepto, hacer esto es mucho más limpio que usar bloques 'if' o' switch'. – fireshadow52

+4

Hay 12 meses para poner en 4 contenedores, por lo que deberíamos dividir por 3. –

+7

Apoyo esta respuesta, sin embargo para hacerlo mejor: System.out.println ((day> 0 && day <13)? Out [(día-1)/3]: "¡Error!"); – emory

3

¿cuál ¿preferir? Es tu código

Definitivamente prefiero la caja del conmutador, pero si tiene algo combinado o p. Ej. 'mayúscula' no es la forma correcta de hacerlo.

Otra cosa: me gustaría escribir el caso del interruptor como el siguiente, porque creo que es mejor leer:

switch(day){ 
    case 1: 
    case 2: 
    case 3: 
     System.out.println("1st Quarter"); 
     break; 
...   
} 

HTH, Andreas

2

¿Qué hay de:

(day>=1 && day <=3) ? System.out.println("1st Quarter") : 
    (day >= 4 && day <= 6) ? System.out.println("2nd Quarter") : 
    (day >=7 && day <= 9) ? System.out.println("3rd Quarter") : 
     (day >= 10 && day <= 12) ? System.out.println("4th Quarter") : System.out.println("Error1"); 

;)

También podría hacer esto:

String val = (day>=1 && day <=3) ? "1st Quarter" : 
     (day >= 4 && day <= 6) ? "2nd Quarter" : 
     (day >=7 && day <= 9) ? "3rd Quarter" : 
      (day >= 10 && day <= 12) ? "4th Quarter" : "Error1"; 
System.out.println(val); 

Creo que cualquiera debería funcionar.

+0

¿cómo puedo reemplazar eso con mi código actual? – Zhianc

+0

Cualquiera de los anteriores debería funcionar. Los operadores ternarios pueden establecer valores o evaluar. –

+1

Eso es solo ser inteligente. – cwallenpoole

3
  • Evite en primer lugar la necesidad de que la lógica se bifurque. La búsqueda de tabla es a menudo una técnica útil. La manipulación aritmética también es importante: busque un patrón en los valores que le interesan y una función que los transforme en algo más simple. También considere el polimorfismo en casos más complejos.

  • Si está manejando todas las excepciones de la misma manera, entonces hágalo en el mismo lugar.

  • Variables de alcance estrictamente cuando sea posible.

  • Solicite la entrada que realmente desea, FFS. :)

import java.io.*;

public class Quarter { 
    public static void main(String[] args) { 
     try { 
      System.out.print("Input the month number (1 = January, 2 = February ... 12 = December): "); 
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
      int month = Integer.parseInt(in.readLine()); 
      int quarter = (month - 1)/3; 
      String[] quarters = new String[]{ "1st", "2nd", "3rd", "4th" }; 
      System.out.println(quarters[quarter] + " Quarter"); 
     } catch (Exception e) { // IOException for non-numeric, or AIOOBE for out of range 
      System.out.println("Error!"); 
     } 
    } 
} 
+1

(-1 - 1)/3 == 0 – Robert

2

No me queda claro si la pregunta es sobre soluciones al código de ejemplo específico, o sobre la estructura en general. Entonces, algunas virtudes del enfoque if-else para su consideración.

  • if-else es más común en el código general, debido a que el número de tipos de datos aceptados por el interruptor es limitado y el interruptor en sí está limitado para compilar los valores de tiempo. Más familiar es mejor para la legibilidad de para un público más amplio.

  • La estructura fundamental no cambia si observa que los requisitos de cambian y necesita admitir un tipo de datos diferente. Tuve que cambiar un montón de conmutadores en las enumeraciones de cadenas para comparar en mi tiempo cuando alguien agregó un requisito para que los usuarios puedan configurar las opciones.

  • La necesidad de utilizar el descanso; correctamente dentro de los interruptores introduce oportunidades para errores extraños que solo aparecen en casos de esquina como los interruptores crecen grandes y complicados.

Por supuesto, siendo un programador personal de la empresa que habría creado un timeUnitSubDivisionResolvingVisitor ... :)

1

simplemente una forma alternativa de implementar es a través de un mapa. Lo hará configurable, especialmente si está usando Spring, donde puede tener esta configuración de variables de Map en su bean.xml, si así lo desea.

De todos modos aquí es la alternativa:

Map<Integer, String> m = new HashMap<Integer, String>(); 
m.put(1, "1st Quarter"); 
m.put(2, "1st Quarter"); 
m.put(3, "1st Quarter"); 
m.put(4, "2nd Quarter"); 
m.put(5, "2nd Quarter"); 
m.put(6, "2nd Quarter"); 
m.put(7, "3rd Quarter"); 
m.put(8, "3rd Quarter"); 
m.put(9, "3rd Quarter"); 
m.put(10, "4th Quarter"); 
m.put(11, "4th Quarter"); 
m.put(12, "4th Quarter"); 

System.out.println(m.get(d)); 
2
String[] suffix = new String[]{ "st", "nd", "rd", "th" }; 
System.out.println((1 <= day && day <= 12)? 
    String.format("%d%s Quarter", (day-1)/3+1, suffix[(day-1)/3]): 
    "Error!" 
); 
Cuestiones relacionadas