Reputation: 137
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
Reputation: 340158
do { … }
while (
!
List
.of( "AM" , "PM" )
.contains( input.toUpperCase() )
)
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
Reputation: 12523
!AMPM.equalsIgnoreCase("AM") && !AMPM.equalsIgnoreCase("PM")
(as @saka1029deleted suggested) or:
!( 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 |
Upvotes: 1