2017-07-01 1 views
0

Je souhaite recevoir des informations de l'utilisateur et je souhaite trouver un nombre entier, un nombre flottant ou autre. Jusqu'à présent, j'utilise la classe Scanner pour cela. Comme Scanner scan1=new Scanner(System.in); String st= scan1.next(); puis j'essaye d'analyser cette entrée (st) dans int et float respectivement. Mais avec cette approche je ne suis pas capable de satisfaire la condition "else". c'est-à-dire lorsque l'entrée n'est ni chaîne, ni entier, ni flottant. Voici le code que j'ai essayé: -Analyser l'entrée et déterminer le type de données

public String checkInput() { 
    String statement = "This input is of type "; 
    String inputType; 

    Scanner scan1 = new Scanner(System.in); 
    String st = scan1.next(); 
    scan1.close(); 
    inputType = st.getClass().getSimpleName(); 
    try { 
     Float numFloat = Float.parseFloat(st); 
     inputType = numFloat.getClass().getSimpleName(); 

    } catch (NumberFormatException e) { 

    } 
    try { 
     Integer numInt = Integer.parseInt(st); 
     inputType = numInt.getClass().getSimpleName(); 
    } catch (NumberFormatException e) { 

    } 

    return statement + inputType; 
} 

ici, je ne suis pas en mesure de décider comment dois-je placer la condition d'autre pour vérifier l'entrée est ni chaîne, ni flotter entier.

+1

Il serait probablement suffisant de simplement changer votre troisième ligne en 'String inputType =" UNKNOWN ";' - si les deux blocs 'try' échouent, vous retournerez' 'Cette entrée est de type UNKNOWN ''. – dimo414

+0

@ dimo414 mais en considérant la cinquième ligne, si l'entrée ne serait pas float ou Integer, elle renverra toujours inputType sous forme de chaîne. –

+0

@Vic pouvez-vous fournir une aide ou un lien, comment pourrais-je l'utiliser. –

Répondre

3

Voici comment je restructurerais votre code. Je vais vous expliquer les changements ci-dessous:

private static final String STATEMENT = "This input is of type "; 

public static String checkInput(Scanner scanner) { 
    if (scanner.hasNextFloat()) { 
    return STATEMENT + Float.class.getSimpleName(); 
    else if (scanner.hasNextInt()) { 
    return STATEMENT + Integer.class.getSimpleName(); 
    } 
    return STATEMENT + "UNKNOWN"; 
} 
  • D'abord, nous avons tiré sur statement dans un constant, car il est pas changé.
  • Ensuite, nous passons le Scanner en tant que paramètre, plutôt que d'en construire un nouveau. Il y a un certain nombre de raisons de préférer ceci, mais le principe est que vous devriez éviter de créer plusieurs instances Scanner lisant de System.in - généralement vous allez créer un tel Scanner dans votre méthode main() et le passer aux méthodes et classes qui ont besoin pour l'utiliser.
  • Ensuite, plutôt que de lire directement à partir du scanner, nous utilisons les méthodes has*() pour inspecter l'état du scanner sans l'avancer. Cela change la sémantique de checkInput(), car quand il retourne l'entrée en cours d'inspection est toujours dans l'analyseur, mais c'est plus cohérent avec une méthode nommée check...() - il devrait inspecter, ne pas changer d'état. Parce que votre implémentation appelle .next() vous perdez l'entrée fournie réelle, ce qui est probablement indésirable.
  • Enfin, nous return de l'intérieur de chaque bloc, plutôt que de définir une variable temporaire inputType et le renvoyer à la fin.

Votre méthode main() peut maintenant ressembler à ceci:

public static void main(String[] args) { 
    // using try-with-resources so we don't have to call .close() 
    try (Scanner scanner = new Scanner(System.in)) { 
    System.out.println(checkInput(scanner)); 
    String input = scanner.next(); // this actually advances the scanner 
    System.out.println("You input: " + input); 
    } 
} 

Prendre davantage, vous pouvez préférer avoir checkInput() retourner un Class<?> plutôt que d'un String, puis construire votre déclaration séparément. Cela vous permettrait de gérer les entrées différemment. Par exemple:

public static Class<?> inputType(Scanner scanner) { 
    if (scanner.hasNextFloat()) { 
    return Float.class; 
    else if (scanner.hasNextInt()) { 
    return Integer.class; 
    } 
    // add other types as needed 
    return String.class; 
} 

public static void main(String[] args) { 
    try (Scanner scanner = new Scanner(System.in)) { 
    Class<?> inputType = inputType(scanner); 
    String input = scanner.next(); 
    System.out.println("You input: " + input); 
    if (inputType.equals(Integer.class)) { 
     System.out.prinln("That's a valid integer!"); 
    } 
    } 
} 

Cela dit, nous sommes très bien réinventer la roue. La « bonne » façon d'utiliser Scanner est d'utiliser les méthodes tapées directement - par exemple .:

if (scanner.hasNextInt()) { 
    int value = scanner.nextInt(); 
} 

On évite ainsi besoin de faire une vérification de type manuel ou busywork similaire - il suffit de laisser faire Scanner la validation pour vous.

+0

Merci pour une explication détaillée :) –