last two characters of string challenge

Hi,

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;
}

Open in new window


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

Open in new window

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
LVL 7
gudii9Asked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

ozoCommented:
Do the  len>=2 on the left side of the && so it can prevent the substring(len-2) when it is false
0
gudii9Author Commented:
public boolean endsLy(String str) {

int len=str.length();

if(len>=2 && str.substring(len-2).equals("ly"))
{
return true;
}
  return false;
}

Open in new window


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

Open in new window


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)
0
ozoCommented:
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.
0
Angular Fundamentals

Learn the fundamentals of Angular 2, a JavaScript framework for developing dynamic single page applications.

gudii9Author Commented:
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).equals("ly"))
i would have avoided this bottle neck. please advise
0
ozoCommented:
No, & does not shortcut.  && is the shortcut operator
0
gudii9Author Commented:
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	

Open in new window

0
awking00Information Technology SpecialistCommented:
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.
0
ozoCommented:
unlike with len>=2 && str.substring(len-2).equals("ly")
when you do str.substring(len-2).equals("ly")& len>=2, the str.substring(len-2) is executed regardless of whether the len>=2 is satisfied
0
awking00Information Technology SpecialistCommented:
Another chance to use StringBuilder -
      public static boolean endsLy(String str) {
            StringBuilder sb = new StringBuilder(str);
            return sb.reverse().substring(0, 2).equalsIgnoreCase("yl");
      }
0
ozoCommented:
    public static boolean endsLy(String str) {
            StringBuilder sb = new StringBuilder(str);
            return sb.reverse().substring(0, 2).equalsIgnoreCase("yl");
      }
Expected      Run      
endsLy("y") → false      Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: 2 (line number:3)      X
endsLy("") → false      Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: 2 (line number:3)      X

but
  return sb.reverse().toString().startsWith("yl");
would work
0
awking00Information Technology SpecialistCommented:
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().toLowerCase().startsWith("yl");
0
gudii9Author Commented:
public boolean endsLy(String str) {

int len=str.length();

if(len>=2 &str.substring(len-2).equals("ly") )
{
return true;
}
  return false;
}

Open in new window


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

Open in new window

I like stringbuilder solution too.
0
ozoCommented:
http://codingbat.com/prob/p103895 does not call for case insensitivity
0
ozoCommented:
& does not shortcut.  && is the shortcut operator

& tries to evaluate both operands regardless of the value of the other operand.
0
gudii9Author Commented:
i see now why we only have to use &&

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?
0
awking00Information Technology SpecialistCommented:
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".
0
ozoCommented:
http://codingbat.com/prob/p103895 does say that upper and and lower character does not matter
so the toLowerCase() suggested in http:#a40450111 is uncalled-for

On the other hand, the problem does not clearly specify or test the behaviour for strings ending in "LY", so we cannot say that toLowerCase() is wrong.
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.
0
gudii9Author Commented:
   public  boolean endsLy(String str) {
            StringBuilder sb = new StringBuilder(str);
           // return sb.reverse().substring(0, 2).equalsIgnoreCase("yl");
           return sb.reverse().toString().startsWith("ly");
      }

Open in new window

when i wrote as above it failed
Expected	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	  

Open in new window


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.
0
awking00Information Technology SpecialistCommented:
It needs to be startsWith("yl") as you have reversed the string.
0
gudii9Author Commented:
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.
0
awking00Information Technology SpecialistCommented:
Why did we make it complicated? How about -
return sb.toString().endsWith("ly");
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
ozoCommented:
public boolean endsLy(String str) {
  return str.endsWith("ly");
}
0
awking00Information Technology SpecialistCommented:
ozo,
That's even less complicated and the best solution yet.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Java

From novice to tech pro — start learning today.