Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以任意顺序为程序分配输入?_Java - Fatal编程技术网

Java 如何以任意顺序为程序分配输入?

Java 如何以任意顺序为程序分配输入?,java,Java,我有四个输入到我的代码中,我想能够做的是在控制台中以我选择的任何顺序输入它们 所以我可以输入: t=20,d=100,t=500,d=100 或 d=100,t=20,d=100,t=500 因此,不管顺序如何,只要我输入“t=something”、“d=something”、t=“something”和d=“something”,它就会将正确的整数值赋给变量 这就是我到目前为止所做的: int t=keyboard.nextInt();int d=keyboard.nextInt();int

我有四个输入到我的代码中,我想能够做的是在控制台中以我选择的任何顺序输入它们

所以我可以输入:

t=20,d=100,t=500,d=100

d=100,t=20,d=100,t=500

因此,不管顺序如何,只要我输入“t=something”、“d=something”、t=“something”和d=“something”,它就会将正确的整数值赋给变量

这就是我到目前为止所做的:


int t=keyboard.nextInt();int d=keyboard.nextInt();int D=keyboard.nextInt();int T=keyboard.nextInt();


我将如何实现这一点?

如果您要逐个输入,请使用此

使用“开关”。只需将注释行替换为相应变量的赋值

String input = keyboard.nextLine();
        switch (input.split(" = ")[0]) {
            case "D":
                // assign value to capital D
                break;
            case "T":
                // code 
                break;
            case "d":
                // code block
                break;
            case "t":
                // code block
                break;
            default:
               // error message

        }

如果您将整个
d=100、t=20、d=100、t=500作为一行输入,请使用以下命令:

String line = "d = 100, t = 20, D = 100, T = 500"; // substitute nextLine() here
    String[] split_line = line.split(", ");
    for (String input : split_line){
        switch (input.split(" = ")[0]) {
            case "D":
                System.out.println(input.split(" = ")[1]);
                break;
            case "T":
                // code
                break;
            case "d":
                // code block
                break;
            case "t":
                // code block
                break;
        }
    }

一个简单的解决办法是

public final class Example {
    public static void main(String... args) {
        final int variablesExpected = 3;
        final Map<String, Integer> variables = new HashMap<>();
        final Scanner keyboard = new Scanner(System.in);

        // read until there are 3 varibles
        while(variables.size() != variablesExpected) {
            // read a line from the user
            final String line = keyboard.nextLine();
            // split it into 2 Strings (hopefully): varible name and varible value
            final String[] expression = line.split("\\s*=\\s*");

            if (expression.length == 2) {
                // expression[0] is the variable name
                // Integer.valueOf(expression[1]) is its integer value
                variables.put(expression[0], Integer.valueOf(expression[1]));
            }
        }

        System.out.println(variables);
    }
}
它更灵活,不强制用户输入您定义的确切变量名。如果是要求,请定义一个
集合
,并针对每个输入检查表达式的第一部分是否出现在该
集合

public final class Example {
    public static void main(String... args) throws Throwable {
        final Map<String, Integer> variables = new HashMap<>();
        final Scanner keyboard = new Scanner(System.in);
        final Set<String> expectedVariableNames = new HashSet<>(Arrays.asList("t", "T", "d", "D"));

        while(variables.size() != expectedVariableNames.size()) {
            final String line = keyboard.nextLine();
            final String[] expression = line.split("\\s*=\\s*");

            if (expression.length == 2 && expectedVariableNames.contains(expression[0])) {
                variables.put(expression[0], Integer.valueOf(expression[1]));
            }
        }

        System.out.println(variables);
    }
}

我首先按照老程序员的建议,把这行作为一个字符串来读。您可以使用
split()
substring()
方法分析字符串:

String input = keyboard.nextLine();
               // Per your example, would be something like "t=20,d=100,T=500,D=100"
int t = 0, d = 0, T = 0, D = 0;

String[] inputArray = input.split(","); // Splits the input string at each comma & returns an array

for(String s : inputArray) {
    if(s.startsWith("t"))
            t = Integer.parseInt(s.substring(2));
    else if(s.startsWith("d"))
            d = Integer.parseInt(s.substring(2));
    else if(s.startsWith("T"))
            T = Integer.parseInt(s.substring(2));
    else if(s.startsWith("D"))
            D = Integer.parseInt(s.substring(2));
}

您可能会使用
映射
而不是显式变量。首先,我会删除=符号之间的间距,然后将整行作为字符串阅读并解析。谢谢,这是我的第一堂java课(python背景),我们的教授没有讨论与您提到的内容相关的任何内容。java新手会知道有没有更简单的解决方案?@John字符串类是您经常使用的一个,因此,我希望您会发现,在“默认”处理无效输入的早期学习它的一些方法会有很大的好处。@RoddyofFrozenpeas补充道。
input.split
示例输入行将为您提供
[“t”,“20,d”,“100,t”(等)
-您必须先用逗号分割,然后等分。@StephenP它应该接受整行还是只接受其中一行?OP不明确,但问题中的示例是
t=20,d=100,t=500,d=100
,我认为这是一个输入行,由逗号分隔的赋值列表组成。我个人会将其编码为允许在逗号和等号周围使用可选空格,就像Andrews answer在正则表达式中所做的那样。
t = 3
d = 3
D       // invalid
d = 45  // overrides d = 3
D = 12 
l = 34  // invalid
T = 12

{t=3, d=45, D=12, T=12}
String input = keyboard.nextLine();
               // Per your example, would be something like "t=20,d=100,T=500,D=100"
int t = 0, d = 0, T = 0, D = 0;

String[] inputArray = input.split(","); // Splits the input string at each comma & returns an array

for(String s : inputArray) {
    if(s.startsWith("t"))
            t = Integer.parseInt(s.substring(2));
    else if(s.startsWith("d"))
            d = Integer.parseInt(s.substring(2));
    else if(s.startsWith("T"))
            T = Integer.parseInt(s.substring(2));
    else if(s.startsWith("D"))
            D = Integer.parseInt(s.substring(2));
}