Estoy tratando de escribir un programa que reproduzca una versión recortada del juego de cartas Spades, y me gustaría hacer que mi código sea más eficiente mediante el uso de una declaración de cambio en lugar de repetir if/else if/else. Necesito que la función tome una cadena (tarjeta de usuario), que se parece a "Picas, 2" o "Diamantes, 6". Lo necesito para guardar el número al final de la cadena en un tipo de datos int. A continuación se muestran las declaraciones de trabajo if/else if/else.
public static int getUserValue(String userCard) { int userValue = 0; if (userCard.contains("4")) { userValue = 4; } else if (userCard.contains("5")) { userValue = 5; } else if (userCard.contains("6")) { userValue = 6; } else if (userCard.contains("7")) { userValue = 7; } else if (userCard.contains("8")) { userValue = 8; } else if (userCard.contains("9")) { userValue = 9; } else if (userCard.contains("10")) { userValue = 10; } else if (userCard.contains("11")) { userValue = 11; } else if (userCard.contains("12")) { userValue = 12; } else if (userCard.contains("13")) { userValue = 13; } else if (userCard.contains("1")) { userValue = 1; } else if (userCard.contains("2")) { userValue = 2; } else if (userCard.contains("3")) { userValue = 3; } return userValue; }Así que pensé que podría hacer algo como
public static int getUserValue(String userCard) { int userValue = 0; switch (userCard){ case userCard.contains("4"): userValue = 4; break; } //etc, goes up to 13 then evaluates if 1, 2, 3. return userValue; }Da un error que no puedo convertir de booleano a cadena. ¿Hay alguna manera de que pueda cambiar esto o escribirlo para que funcione de la manera que quiero?
En su lugar, debe usar algo como una clase UserCard :
public class UserCard { private Suit _suit; private int _value; // Constructor // getter + setter } public enum Suit { DIAMONDS, HEARTS, SPADES, CLUBS; } De esa manera, ni siquiera necesita el interruptor porque ya tiene ese valor que desea extraer. Su getUserValue es simplemente:
public static int getUserValue(UserCard userCard) { return userCard.getValue(); }Para responder a la pregunta apenas como se hace, no, no puede usar el interruptor como le gustaría en su ejemplo.
Los casos de un interruptor tienen que ser constantes. Puede usar valores literales, campos finales estáticos u operadores para combinarlos; pero no llamar a un método. Entonces, por ejemplo, el case 1+2 es válido así como el case A+B , incluso cuando A y B son cadenas.
Sin embargo, hay una mejor manera de extraer el valor de su cadena, usando String.indexOf, String.substring e Integer.parseInt, o expresiones regulares para cosas más complejas. O, mejor aún, siga otras respuestas que sugieren crear una clase de tarjeta.