Как обрабатывать различные типы ввода в java - PullRequest
0 голосов
/ 26 марта 2020

В этом вопросе

Напишите программу, которая демонстрирует перегрузку метода , имеющую следующий метод:

1.Interest_rate*(int s, int a, float d)
2.Interest_rate*(float s, int a, float d)
3.Interest_rate*(int s, int a, double d)

и эти это тестовые случаи, основанные на формате ввода метода:

Тестовый пример 1

1000 66 12.1f

Тест Случай 2

1000f 45 12.1f

, так как я могу создать основную функцию, в которой вход автоматически запускает нужную функцию, как в test case 1, он должен вызывать 1.Interest_rate и , контрольный пример 2 должен вызывать 2.Interest_rate и т. д.

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Я бы рекомендовал использовать Regex Matcher для сортировки входных регистров.

целое число может быть обнаружено как -?\d+

с плавающей точкой, как в ваши примеры как -?\d+(\.\d+)?f

удваивается как -?\d+\.\d+

пробел как \s один или несколько пробелов \s+

может исследовать Java Регулярное выражение в целом может помочь.

Далее вы должны понять, что такое перегрузка метода.

После некоторого повторного исследования вы обнаружите, что в принципе вы можете создайте несколько методов с одним и тем же именем, но с другими типами входных аргументов.

Если вы полностью не разбираетесь в верхних темах (плюс, как работает сканер) в целом, вы можете начать реализацию.

Для В случае, если вы сделали все это и все еще застряли, может, после реализации вопрос поможет вам. Но как всегда: используйте только тот код, который вы полностью понимаете, иначе он нанесет ответный удар.

import java.util.Scanner;

public class ScannerWithDifferentInputs {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            String input = sc.nextLine();
            if (input.matches("-?\\d+\\s+\\d+\\s+\\d+(\\.\\d+)?f")) {
                input.replace("f", "");
                String[] parts = input.split("\\s+");
                interestRate(Integer.parseInt(parts[0]), Integer.parseInt(parts[1]), Float.parseFloat(parts[2]));
            } else if (input.matches("-?\\d+(\\.\\d+)?f\\s+\\d+\\s+\\d+(\\.\\d+)?f")) {
                input.replace("f", "");
                String[] parts = input.split("\\s+");
                interestRate(Float.parseFloat(parts[0]), Integer.parseInt(parts[1]), Float.parseFloat(parts[2]));
            } else if (input.matches("-?\\d+\\s+\\d+\\s+\\d+\\.\\d+")) {
                String[] parts = input.split("\\s+");
                interestRate(Integer.parseInt(parts[0]), Integer.parseInt(parts[1]), Double.parseDouble(parts[2]));
            } else if (input.equals("q")) {
                System.out.println("exit");
                break;
            } else {
                System.out.println("Invalid Input");
            }
        }
    }

    static void interestRate(int i1, int i2, float f) {
        System.out.println("case int, int, float");
        System.out.println(i1 + " " + i2 + " " + f);
    }

    static void interestRate(float f1, int i, float f2) {
        System.out.println("case float, int, float");
        System.out.println(f1 + " " + i + " " + f2);
    }

    static void interestRate(int i1, int i2, double d) {
        System.out.println("case int, int, double");
        System.out.println(i1 + " " + i2 + " " + d);
    }

}
0 голосов
/ 26 марта 2020

Давайте рассмотрим только первые две перегрузки. Вы должны проверить, является ли первое число, предоставленное программе, числом с плавающей запятой или целым числом. В соответствии с вашим входным определением вы можете сделать это так:

if ( args[0].endsWith("f") )
  // First number is a float
  Interest_rate(Float.parseFloat(args[0]), Integer.parseInt(args[1]), Float.parseFloat(args[2]));
else
  // First number is an integer
  Interest_rate(Integer.parseInt(args[0]), Integer.parseInt(args[1]), Float.parseFloat(args[2]));

Как видите, в обоих случаях мы вызываем метод Interest_rate, но с разными типами. Компилятор выберет правильную перегрузку.

...