gudii9
asked on
last two characters of string challenge
Hi,
I am working on below coding challenge
http://codingbat.com/prob/p103895
i wrote as below
My test cases are failing as below
i wonder why i keep getting string index out of bound many times.
Please advise.Thanks in advance
I am working on below coding challenge
http://codingbat.com/prob/p103895
i wrote as below
public boolean endsLy(String str) {
int len=str.length();
if(str.substring(len-2).equals("ly")&& len>=2)
{
return true;
}
return false;
}
My test cases are failing as below
Expected Run
endsLy("oddly") → true true OK
endsLy("y") → false Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: -1 (line number:5) X
endsLy("oddy") → false false OK
endsLy("oddl") → false false OK
endsLy("olydd") → false false OK
endsLy("ly") → true true OK
endsLy("") → false Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: -2 (line number:5) X
endsLy("falsey") → false false OK
endsLy("evenly") → true true OK
other tests
i would like to know how can improve on my above code. i wonder why i keep getting string index out of bound many times.
Please advise.Thanks in advance
Do the len>=2 on the left side of the && so it can prevent the substring(len-2) when it is false
ASKER
public boolean endsLy(String str) {
int len=str.length();
if(len>=2 && str.substring(len-2).equals("ly"))
{
return true;
}
return false;
}
now it passed all as below
Expected Run
endsLy("oddly") → true true OK
endsLy("y") → false false OK
endsLy("oddy") → false false OK
endsLy("oddl") → false false OK
endsLy("olydd") → false false OK
endsLy("ly") → true true OK
endsLy("") → false false OK
endsLy("falsey") → false false OK
endsLy("evenly") → true true OK
other tests
OK
i did not realize first come first serve(i was under impression as long as both conditions there that is sufficient but in this case order also important)
The && and || operators perform Conditional-AND and Conditional-OR operations on two boolean expressions. These operators exhibit "short-circuiting" behavior, which means that the second operand is evaluated only if needed.https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html
In this case, it also means that the second operand is evaluated only if valid.
ASKER
if(len>=2 && str.substring(len-2).equals("ly"))
instead of above shortcircuit And if i use simle & as below
if(len>=2 & str.substring(len-2).equali would have avoided this bottle neck. please advises("ly"))
No, & does not shortcut. && is the shortcut operator
ASKER
public boolean endsLy(String str) {
int len=str.length();
if(str.substring(len-2).equals("ly") & len>=2 )
{
return true;
}
return false;
}
Correct. When write like above i am getting string index out of bound
Expected Run
endsLy("oddly") → true true OK
endsLy("y") → false Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: -1 (line number:5) X
endsLy("oddy") → false false OK
endsLy("oddl") → false false OK
endsLy("olydd") → false false OK
endsLy("ly") → true true OK
endsLy("") → false Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: -2 (line number:5) X
endsLy("falsey") → false false OK
endsLy("evenly") → true true OK
other tests
OK
Think of what you are asking. If the substring beginning at the index of len - 2 equals "ly" then ...
If the length of the string is 0 or 1, then it's trying to evaluate the substring beginning at index -1 or -2, which will always be out of bounds.
If the length of the string is 0 or 1, then it's trying to evaluate the substring beginning at index -1 or -2, which will always be out of bounds.
unlike with len>=2 && str.substring(len-2).equal s("ly")
when you do str.substring(len-2).equal s("ly")& len>=2, the str.substring(len-2) is executed regardless of whether the len>=2 is satisfied
when you do str.substring(len-2).equal
Another chance to use StringBuilder -
public static boolean endsLy(String str) {
StringBuilder sb = new StringBuilder(str);
return sb.reverse().substring(0, 2).equalsIgnoreCase("yl");
}
public static boolean endsLy(String str) {
StringBuilder sb = new StringBuilder(str);
return sb.reverse().substring(0, 2).equalsIgnoreCase("yl");
}
public static boolean endsLy(String str) {Expected Run
StringBuilder sb = new StringBuilder(str);
return sb.reverse().substring(0, 2).equalsIgnoreCase("yl");
}
endsLy("y") → false Exception:java.lang.String
endsLy("") → false Exception:java.lang.String
but
return sb.reverse().toString().st
would work
Good point, ozo. I didn't test with 1 character or empty string. :-(
One more refinement would be using toLowerCase to make case insensitive.
return sb.reverse().toString().to LowerCase( ).startsWi th("yl");
One more refinement would be using toLowerCase to make case insensitive.
return sb.reverse().toString().to
ASKER
public boolean endsLy(String str) {
int len=str.length();
if(len>=2 &str.substring(len-2).equals("ly") )
{
return true;
}
return false;
}
without shortcut && if i use only one & and wrote as above still getting string out of bound which does not make sense to me.
for endsLy("y") it should not even go and check second condition in if loop right to throw exception?
please advise
ndsLy("oddly") → true true OK
endsLy("y") → false Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: -1 (line number:5) X
endsLy("oddy") → false false OK
endsLy("oddl") → false false OK
endsLy("olydd") → false false OK
endsLy("ly") → true true OK
endsLy("") → false Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: -2 (line number:5) X
endsLy("falsey") → false false OK
endsLy("evenly") → true true OK
other tests
I like stringbuilder solution too.
http://codingbat.com/prob/p103895 does not call for case insensitivity
& does not shortcut. && is the shortcut operator
& tries to evaluate both operands regardless of the value of the other operand.
& tries to evaluate both operands regardless of the value of the other operand.
ASKER
i see now why we only have to use &&
what you mean by above statement. you mean like upper and and lower character does not matter for the challenge right?
does not call for case insensitivity
what you mean by above statement. you mean like upper and and lower character does not matter for the challenge right?
The CodingBat site says Given a string, return true if it ends in "ly", which is lower case and doesn't mention if it ends in "LY", so "LOVELY" would return false. I was interpreting the question (likely incorrectly) to return true if it ended in "LY", "Ly', "lY", or "ly".
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
public boolean endsLy(String str) {
StringBuilder sb = new StringBuilder(str);
// return sb.reverse().substring(0, 2).equalsIgnoreCase("yl");
return sb.reverse().toString().startsWith("ly");
}
when i wrote as above it failedExpected Run
endsLy("oddly") → true false X
endsLy("y") → false false OK
endsLy("oddy") → false false OK
endsLy("oddl") → false false OK
endsLy("olydd") → false false OK
endsLy("ly") → true false X
endsLy("") → false false OK
endsLy("falsey") → false false OK
endsLy("evenly") → true false X
other tests
X
nor does it test any cases that end in "yl" so it might also be argued that sorting before testing could also be valid.i think it is failing if sorting or ordering(what is the difference?") is changing as above.
It needs to be startsWith("yl") as you have reversed the string.
ASKER
Then again, while it doesn't explicitly specify the the case of "ly" must be exact, neither does it explicitly specify that the order of "ly" must be exact, nor does it test any cases that end in "yl" so it might also be argued that sorting before testing could also be valid.
i have not clearly understood above statement. Can you please elaborate.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
public boolean endsLy(String str) {
return str.endsWith("ly");
}
return str.endsWith("ly");
}
ozo,
That's even less complicated and the best solution yet.
That's even less complicated and the best solution yet.