字符串的逻辑运算符问题

Issue with logical operator for Strings

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

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")

我做错了什么?

!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

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() ) ;