What's wrong in this string comparison inside main method? - java

I am comparing a value of a string inside a main method, however, it keeps on saying that it is invalid.
Here is the code:
public static void main(String[] args) {
String a = "X";
if(!a.equalsIgnoreCase("X") || !a.equalsIgnoreCase("Z")){
System.out.println("invalid");
}
}

There is nothing wrong with your code.
public static void main(String[] args) {
String a = "X";
if(!a.equalsIgnoreCase("X") || !a.equalsIgnoreCase("Z")){
System.out.println("invalid");
}
}
Explanation:
a.equalsIgnoreCase("X") is true, and !a.equalsIgnoreCase("X") is false.
Since first condition is false, it evaluates the second condition.
a.equalsIgnoreCase("Z") is false, and !a.equalsIgnoreCase("Z") is true.
Second condition is true, hence "invalid" is printed.
Note: Maybe you should let us know what you are trying to achieve with the String comparisons, so that we can give you better feedback. Let us know what is the desired logic, i.e. what is valid, and what is not.
Based on the comment "Any letter that is not equal to "X" or "Z" should be invalid",
Answer:
if( !(a.equalsIgnoreCase("X") || a.equalsIgnoreCase("Z")) ) {
System.out.println("Invalid");
}
or its equivalent (as proposed by Fast Snail):
if( !a.equalsIgnoreCase("X") && !a.equalsIgnoreCase("Z") ) {
System.out.println("Invalid");
}
¬(X ∨ Z) ≡ ¬X ∧ ¬Z (De Morgan's Law)

Related

Program Keeps Out Printing Both Messages

I have some code going on here, I'm trying to get the user to input a Letter,
Number, or a Symbol, I have them all working, but when I enter a Letter, it
outprints both the "You have entered a Letter" and "You have entered a
Symbol" But thing is, I never entered a Symbol in the first place, just a
Letter. Heres how it looks:
Enter a SINGLE character:
D
You entered a LETTER!
You entered a SYMBOL!
import static java.lang.System.*;
import java.util.*;
public class Java1304
{
public static void main(String[] args)
{
new Problem();
}
}
class Problem
{
char letter;
public Problem()
{
input();
process();
output();
}
void input()
{
Scanner scan = new Scanner(in);
out.println("Enter a SINGLE character:");
letter = scan.nextLine().charAt(0);
}
void process()
{
if(Character.isLetter(letter))
{
out.println("You entered a LETTER!");
}
if(Character.isDigit(letter))
{
out.println("You entered a NUMBER!");
}
if(!Character.isLetter(letter) || !Character.isDigit(letter))
//else
out.println("You entered a SYMBOL!");
}
void output()
{
out.println();
out.println();
out.println();
}
}
Your desired behavior is not reflected in the code you wrote. The statement !Character.isLetter(letter) || !Character.isDigit(letter) evaluates to true if either the character is not a letter OR not a number (as || is the logical operator for or).
Going back to your example, if you type "A", Character.isDigit(letter) evaluates to false, so !Character.isDigit(letter) evaluates to true, so !Character.isLetter(letter) || !Character.isDigit(letter) evaluates to true.
Based on your example, your if block could be better written as:
if(Character.isLetter(letter)){
out.println("You entered a LETTER!");
} else if(Character.isDigit(letter)){
out.println("You entered a NUMBER!");
} else {
out.println("You entered a SYMBOL!");
}
De Morgan's laws strike again! The || is your culprit. It needs to be && for your case.
Your second if statement is true because !Character.isLetter(letter) is true. The || is a logical or. That means if one of the statements is true it enters the if clause.
So just change the last if for an else and you should be fine.
Your problem is that last if statement- let's step through your use case there:
you enter D.
isLetter('D') is true so it prints
isDigit('D') is false so that doesn't print
!isLetter('D') && !isDigit('D') is the same as
! true || ! false (evaluating the method calls) which is the same as
false || true (evaluating the !'s) which is the same as
true (evaluating the ||) so it prints.
To fix it, you can change your || to &&, or put back the else clause you have commented out. I personally think the else clause is a better solution because it clearly communicates your idea that what's not a letter and not a digit must be a symbol without having to explicitly check for each one.
if(!Character.isLetter(letter) || !Character.isDigit(letter))
You used OR instead of AND, so letter "D" will pass when you check for !Character.isDigit(letter)
In the last if statement, change the || to &&.

Left hand side of an assignment must be a variable Error

Please don't mind the logic of the code; I just want help understanding the error, which seems to occur at the last else statement.
package day1.samples;
import java.util.Scanner;
public class Horscope {
public static void main(String[] args) {
// TODO Auto-generated method stub
String [] Birth={"January","February","March"};
System.out.println("Please Enter Your BirthMonth");
Scanner input =new Scanner(System.in);
String X;
X=input.nextLine();
if (X==Birth[0]) {
System.out.println("Your Horoscope is Gemini");
} else if(X==Birth[1]) {
System.out.println("your Horscope is libra");
} else (X==Birth[2]) {
System.out.println("Your horscope is Leo");
}
}
You need to remove the else condition. Only else if can have condition. You can also change the last else to else if.
X=input.nextLine();
if (X.equals(Birth[0])) {
System.out.println("Your Horoscope is Gemini");
} else if(X.equals(Birth[1])) {
System.out.println("your Horscope is libra");
} else {
System.out.println("Your horscope is Leo");
}
Also you don't compare strings with == you should use .equals more details click here
EG:
X.equals(Birth[0])
It should be .equals
} else if (X.equals(Birth[2])) {
Here:
} else (X==Birth[2]) {
should be
} else if (X==Birth[2]) {
Besides == should not be used instead of equals method. I'm just answering about the cause of Left hand side of an assignment must be a variable error.
Else don't have condition checking part. Remove () in front of else.
Or
Use another ladder of else if simply put if before braces.
And other than logic use X.equals("some value") to compare values rather == compares references.
You don't need to specify the condition for the last condition in an if...else ladder. You can either use else if (condition) or just the else.
You are getting the error as your syntax is wrong by using else (condition). Hope this helps.
Also, you should always use the equals() method to check if two strings are equal as it compares the original content of the string. It compares the values of string for equality.
Hence, in your case it should be -
X.equals(Birth[2])

Java - validating a subject Code

I have a subject code e.g: ABC123 that is a string
I need to ensure that it is of length 6, the first 3 characters are letters and the last 3 are numbers.
I would like to try and do it all in an if statement? I can work the length but cannot figure out the numeric and letter part of things. e.g:
public void isValidCode(String subjectCode2){
str = subjectCode2;
if (str.length() == 6 && """"NEED TO TEST OTHERS HERE??""" ) {
System.out.println("The code is valid");
}
else {
System.out.println("The code is not valid");
}
You can always use Regular Expressions, and the matches() method of the String class.
if (str.matches("[a-zA-Z]{3}[0-9]{3}")) {
// Validation succeeded
}
else {
// Validation failed
}
To test that the first three letters are letters, you could use a loop. Similarly, use a loop for testing that the last three digits are numbers. You might find the functions in the Character class helpful.
I would change the method signature so that it is not a void method but rather declared to return a boolean. Then you could have several if statements that if false returns false. At the bottom, return true if it passes all tests.
public boolean isValidCode(String code) {
if (code.length() != 6) {
return false;
}
// here check if first 3 chars are letters
// here check if last 3 chars are numbers
return true;
}
Then the calling code can do a println if desired.
String test = "ABC123";
if (isValidCode(test)) {
System.out.println("The code is valid");
} else {
System.out.println("The code is not valid");
}
If by "letter", you mean to include letters in alphabets other than English, you'll need this.
if (str.matches("\\p{L}{3}\\d{3}")) {
Here, \p{L} matches any character that Unicode considers to be a letter, in any language.

Checking if every char in a string belongs to the given set of chars or not (JAVA)

So I need to create a method isValidDNA which works like this:
public boolean isValidDNA()
Returns true if the DNA is valid, i.e, only contains the letters,
A,T,C,G (in uppercase) and at least one of these characters.
All I could think of was this, which apparently doesn't work:
public boolean isValidDNA(){
for (int i=0;i<dna.length();i++){
if (dna.charAt(i)=='A' || dna.charAt(i)=='T' || dna.charAt(i)=='C' || dna.charAt(i)=='G' ){
return true;
}
return false;
}
}
You can use this regular expression:- [ATCG]+ In code this could look like this:
public boolean isValidDNA(){
return dna.matches("^[ATCG]+$")
}
You make a return statement immediately, which will exit during the first iteration and only check the first character.
You need to store this information in a boolean and return it after you've checked the whole string:
public boolean isValidDNA(String dna){
Boolean result = true;
// Add an extra check for the "at least one character" thing.
for (int i=0; i<dna.length(); i++){
if (dna.charAt(i)!='A' && dna.charAt(i)!='T' && dna.charAt(i)!='C' && dna.charAt(i)!='G' ){
result = false;
}
}
return result;
}
However, you would be better off using regular expressions for these problems.
Try it this way:
public boolean isValidDNA(){
boolean res = true;
for (int i=0;i<dna.length();i++){
if ((dna.charAt(i) != 'A') && (dna.charAt(i)!='T') && (dna.charAt(i)!='C') && (dna.charAt(i)!='G') ){
res = false;
break;
}
}
return res;
}
if your startpoint is that the DNA is valid, it's much more easy to test if it's really so. You only have to test each char of your dna and can stop by the first entry that doesn't satisfy your if-statement.
Using your way, you've almost got it.
Right now, you return true if you find one that's OK, and only return false if all are wrong. You can negate your if condition, and return false as soon as you find one that's not OK, and only return true if all are fine.
I'll leave the coding part up to you.
As others pointed out, regex will be a cleaner solution here.
You can try this implementation.
First declare a constant:
private static final String bases = "ATCG";
And then use it in the method like this:
public boolean isValidDNA() {
boolean isValid = true;
for (char c : dna.toCharArray()) {
if (bases.indexOf(c) < 0) {
isValid = false;
break;
}
}
return isValid;
}
Scanner sc = new Scanner(System.in);
System.out.print("Enter a DNA sequence: ");
seq=sc.nextLine();
if(seq.matches(".*[^ATCG].*")){
System.out.println("Not a valid sequence.");
System.exit(0);
}
This regular expression works so that only sequences containg A,C,T or G with no other charcters, spaces, etc included will continue

If statement always giving the same answer

import java.util.Scanner;
class Practice {
public static void main(String args[]) {
System.out.println("Enter the number of treats you have:");
Scanner treatsScanner = new Scanner(System.in);
int treats = (treatsScanner.nextInt());
System.out.println("Enter the number of hamsters you have:");
Scanner hamstersScanner = new Scanner(System.in);
int hamsters = (hamstersScanner.nextInt());
System.out.println("How many treats does each hamster need?");
Scanner neededTreatsScanner = new Scanner(System.in);
int neededTreats = (neededTreatsScanner.nextInt());
int treatsPerHamster = treats / hamsters;
boolean enoughTreats = treatsPerHamster >= neededTreats;
if (enoughTreats = true) {
System.out.println("There are enough treats for all the hamsters!");
}
else if (enoughTreats = false) {
System.out.println("Oh no! There aren't enough treats!");
}
}
}
Can someone explain to me why this program returns "There are enough treats for all the hamsters!" regardless of whether "neededTreats" > "treatsPerHamster"?
Thank you.
You should use == instead of =
if (enoughTreats == true) {
System.out.println("There are enough treats for all the hamsters!");
}
else {
System.out.println("Oh no! There aren't enough treats!");
}
Remember that == is the comparison operator and = is the assignment operator.
And as Mike mentioned, just having if(enoughTreats) will do the trick for you. No need to use == operator!
As a matter of fact, you don't need the boolean variable enoughTreats at all. You could just write your condition like so:
if (treatsPerHamster >= neededTreats) {
// do one thing
}
else {
// do other
}
You are assigning the value true to enoughtreats.
Try using the equality operator rather than assignment:
if (enoughtreats == true) {
...
}
or simply:
if(enoughtreats) {
...
}
In java, the '=' operator assigns a value to a variable. In this case,
if (enoughTreats = true)
assigns the value 'true' to 'enoughTreats' and then checks if 'enoughTreats' is true (which it always will be).
Instead, you want to put
if (enoughTreats == true)
so that it will check if enoughTreats is true or false.
Use == for equality, not =.
if (enoughTreats = true)
By using =, you are assigning true to enoughTreats. Use the == comparison operator instead.
You need to change these two statements
if (enoughTreats = true)
else if (enoughTreats = false)
into
if (enoughTreats == true)
else if (enoughTreats == false)
You could also shorten the code and get the exact same effect by simply typing this below:
if (enoughTreats)
else
If you put a boolean variable inside of the parenthesis of an if statement by itself, the if statement will check to see if it's true, thus you wouldn't need to type '== true.' You could also replace the else if statement in your code with a simple 'else' because if the enoughTreats variable is not equal to true, the else code will automatically execute without you having to specifically state a condition.
Few things to note and to add to the listed answers
Just one scanner is enough Scanner inputScanner = new Scanner(System.in);
Braces around (...Scanner.nextInt()); is not really necessary
You may need to consider a non zero check for hamsters !
Handle Non Ints & -ve numbers in the input
else if(){} is not required when if(){} has only single boolean check , just an else{ is sufficient

Categories

Resources