【问题标题】:Issue with logical operator for Strings字符串的逻辑运算符问题
【发布时间】:2021-12-21 19:55:40
【问题描述】:

我正在尝试编写一个循环来提示用户输入,直到输入"AM""PM"(不区分大小写)。但是,即使在输入 "AM""PM" 时,以下代码也会让我陷入无限循环。 console 是我的扫描器类变量。

String AMPM = "";
do {
    System.out.println("Enter AM or PM: ");
    AMPM = console.next();
} while (!AMPM.equalsIgnoreCase("AM") || !AMPM.equalsIgnoreCase("PM"));

我已经尝试删除第二个!,它只会打破"AM" 的循环。

!AMPM.equalsIgnoreCase("AM") || AMPM.equalsIgnoreCase("PM")

我做错了什么?

【问题讨论】:

  • 你应该使用&&而不是||

标签: java string while-loop logical-operators


【解决方案1】:
!AMPM.equalsIgnoreCase("AM") && !AMPM.equalsIgnoreCase("PM")

(正如@saka1029deleted 建议的那样) 或:

!( AMPM.equalsIgnoreCase("AM") || AMPM.equalsIgnoreCase("PM") )

说明

AM PM
!AMPM.equalsIgnoreCase("AM") false true
!AMPM.equalsIgnoreCase("PM") true false
!AMPM.equalsIgnoreCase("AM") && !AMPM.equalsIgnoreCase("PM") false false
AM PM
AMPM.equalsIgnoreCase("AM") true false
AMPM.equalsIgnoreCase("PM") false true
AMPM.equalsIgnoreCase("AM") || AMPM.equalsIgnoreCase("PM") true true
!( AMPM.equalsIgnoreCase("AM") || AMPM.equalsIgnoreCase("PM") ) false false

【讨论】:

    【解决方案2】:

    tl;博士

    do { … }
    while (
        !
        List
        .of( "AM" , "PM" )
        .contains( input.toUpperCase() )
    )
    

    详情

    hata 的答案似乎是正确的。

    我发现更容易阅读的另一种方法是使用流。制作目标值的流。然后询问其中任何一个是否与您的输入相匹配。

    boolean expectedInput = List.of( "AM" , "PM" ).stream().anyMatch( target -> target. equalsIgnoreCase( input ) ) ;
    

    一个更简单的替代方法是询问一个列表是否包含转换为大写的输入副本。

    boolean expectedInput = List.of( "AM" , "PM" ).contains( input.toUpperCase() ) ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 2023-02-16
      • 2021-11-28
      • 2020-08-24
      相关资源
      最近更新 更多