如何根据另一个变量设置变量的值?

Posted

技术标签:

【中文标题】如何根据另一个变量设置变量的值?【英文标题】: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 的理解(显然)充其量是有限的,我是最近才开始的。

【问题讨论】:

这能回答你的问题吗? What is 'scope' in Java? 【参考方案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);
    

【讨论】:

以上是关于如何根据另一个变量设置变量的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据另一个变量的行上的值添加一定数量的行

如何根据另一个变量的值使用 dplyr::Distinct

如何根据 R 中的另一个数据帧解码一个数据帧中变量的值?

如何在颤动中更改另一个类中变量的值

将变量的值设置为另一个变量的先前状态值

我的变量的值在另一个文件中发生变化