【问题标题】:How do I set the value of a variable based on another variable?如何根据另一个变量设置变量的值?
【发布时间】:2022-01-10 12:46:58
【问题描述】:

我正在尝试为名为站点的变量获取扫描仪输入,并根据站点的输入将另一个变量 emr 设置为 3 个可能值之一。

import java.util.Scanner;

public class Program
{
    public static void main(String[] args) {
        Scanner read = new Scanner(System.in);
        String site = read.nextLine();
            if (site == "site1"){
                String emr = "sampletext";
            } else if (site == "site2"){
                String emr = "domain";
            } else {
                String emr = " ";
            }
        System.out.print(emr);
    }
}

有什么方法可以让我完成这项工作吗?我对 Java 的理解(显然)充其量是有限的,我是最近才开始的。

【问题讨论】:

标签: java variable-assignment


【解决方案1】:

每个变量在Java 中都有一个作用域。该变量不存在于其范围之外。所以从技术上讲,这里声明的emr

if (site == "site1"){
     String emr = "sampletext";
}

此处无效

else if (site == "site2"){
     String emr = "domain";
}

因为ifelse if 块中的emr 都有block scope

但是,emr 声明如下

String site = read.nextLine();
String emr;

在整个方法中都是有效的,因为它具有方法范围。你可以阅读更多here

工作代码片段如下。

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner read = new Scanner(System.in);
        String site = read.nextLine();
        String emr;

        if (site.equals("site1")){
           emr = "sampletext";
        } else if (site.equals("site2")){
           emr = "domain";
        } else {
           emr = " ";
        }
        System.out.print(emr);
    }
}

在比较Objects(例如String)时,您需要小心。您可能想看看接受的答案here

正如@Hleb Shypula 所指出的,如果您想取消最后一个 else 块,您需要预先将默认值初始化为 emr。以下是更新后的代码。

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner read = new Scanner(System.in);
        String site = read.nextLine();
        String emr = " ";

        if (site.equals("site1")){
           emr = "sampletext";
        } else if (site.equals("site2")){
           emr = "domain";
        } 
        System.out.print(emr);
    }
}

【讨论】:

  • 我们可以直接初始化 emr 变量:String emr = " ";。所以我们可以摆脱最后一个 else 条件。
  • 感谢@HlebShypula 的建议。已对其进行了编辑。
【解决方案2】:

虽然其他答案也可以,但我鼓励您将检查输入值的逻辑和分配响应值的逻辑分开。

请参阅以下内容:

public class ScannerProgram {

  public static void main(String[] args) {
    Scanner read = new Scanner(System.in);
    String site = read.nextLine();
    
    System.out.println(getEmr(site));
  }

  private static String getEmr(String inputString) {
    switch (inputString) {
      case "site1":
        return "sampletext";
      case "site2":
        return "domain";
      default:
        return " ";
    }
  }
}

另外需要注意的是:根据您使用的 Java 版本,您可以进一步减少此代码并利用更新的方法和变量定义。

例如,在 Java 11+ 中,如果在创建时分配了值,则不需要定义变量的类型。换句话说,这样做是多余的。

所以定义

Scanner read = new Scanner(System.in);
String site = read.nextLine();

可能变成

var read = new Scanner(System.in);
var site = read.nextLine();

您可以通过在 Java 17 中编写 switch 语句的功能性方式进一步改进代码:

所以switch语句可以变成如下:

  private static String getEmr(String inputString) {
    return switch (inputString) {
      case "site1" -> "sampletext";
      case "site2" -> "domain";
      default -> " ";
    };
  }

【讨论】:

    【解决方案3】:

    你只需要在 if 语句之外声明 emr 变量。

    我已将您的代码更改如下,正如@chaitanya-guruprasad 提到的,在比较对象和字符串时最好使用“equals”方法。因此,我添加了我错过的内容。抱歉我的延误@nick-tagliamonte。

    import java.util.Scanner;
    
    public class Program
    {
        public static void main(String[] args) {
            Scanner read = new Scanner(System.in);
            String site = read.nextLine();
            String emr;
    
            if (site.equals("site1")){
               emr = "sampletext";
            } else if (site == "site2"){
               emr = "domain";
            } else {
               emr = " ";
            }
            System.out.print(emr);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 2010-12-01
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多