Cua
Cua

Reputation: 137

Issue with logical operator for Strings

I am trying to write a loop to prompt user input until either "AM" or "PM" is entered (case insensitive). However, the following code brings me to an infinite loop even when "AM" or "PM" is being entered. console is my scanner class variable.

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

I have tried the to remove the the second ! as such and it only breaks the loop for "AM".

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

What am I doing wrongly?

Upvotes: 0

Views: 154

Answers (2)

Basil Bourque
Basil Bourque

Reputation: 340158

tl;dr

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

Details

The Answer by hata seems correct.

An alternative approach that I find easier to read involves the use of streams. Make a stream of the target values. Then ask if any of those match your input.

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

An even simpler alternative asks a list if it contains a copy of the input converted to uppercase.

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

Upvotes: 0

hata
hata

Reputation: 12523

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

(as @saka1029deleted suggested) or:

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

Explanation

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

Upvotes: 1

Related Questions