Solved

last two characters of string challenge

Posted on 2014-11-14
23
212 Views
Last Modified: 2014-11-19
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
0
Comment
Question by:gudii9
  • 9
  • 7
  • 7
23 Comments
 
LVL 84

Expert Comment

by:ozo
ID: 40443598
Do the  len>=2 on the left side of the && so it can prevent the substring(len-2) when it is false
0
 
LVL 7

Author Comment

by:gudii9
ID: 40443639
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
 
LVL 84

Expert Comment

by:ozo
ID: 40443655
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
 
LVL 7

Author Comment

by:gudii9
ID: 40443676
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
 
LVL 84

Expert Comment

by:ozo
ID: 40443711
No, & does not shortcut.  && is the shortcut operator
0
 
LVL 7

Author Comment

by:gudii9
ID: 40444050
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
 
LVL 31

Expert Comment

by:awking00
ID: 40444469
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
 
LVL 84

Expert Comment

by:ozo
ID: 40445331
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
 
LVL 31

Expert Comment

by:awking00
ID: 40449883
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
 
LVL 84

Expert Comment

by:ozo
ID: 40450005
    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
 
LVL 31

Expert Comment

by:awking00
ID: 40450111
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
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 7

Author Comment

by:gudii9
ID: 40450119
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
 
LVL 84

Expert Comment

by:ozo
ID: 40450124
http://codingbat.com/prob/p103895 does not call for case insensitivity
0
 
LVL 84

Expert Comment

by:ozo
ID: 40450125
& does not shortcut.  && is the shortcut operator

& tries to evaluate both operands regardless of the value of the other operand.
0
 
LVL 7

Author Comment

by:gudii9
ID: 40450229
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
 
LVL 31

Expert Comment

by:awking00
ID: 40450254
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
 
LVL 84

Assisted Solution

by:ozo
ozo earned 250 total points
ID: 40450258
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
 
LVL 7

Author Comment

by:gudii9
ID: 40450466
   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
 
LVL 31

Expert Comment

by:awking00
ID: 40450500
It needs to be startsWith("yl") as you have reversed the string.
0
 
LVL 7

Author Comment

by:gudii9
ID: 40450558
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
 
LVL 31

Accepted Solution

by:
awking00 earned 250 total points
ID: 40450610
Why did we make it complicated? How about -
return sb.toString().endsWith("ly");
0
 
LVL 84

Expert Comment

by:ozo
ID: 40451249
public boolean endsLy(String str) {
  return str.endsWith("ly");
}
0
 
LVL 31

Expert Comment

by:awking00
ID: 40452239
ozo,
That's even less complicated and the best solution yet.
0

Featured Post

What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

Join & Write a Comment

Suggested Solutions

Introduction This article is the second of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers the basic installation and configuration of the test automation tools used by…
In this post we will learn how to connect and configure Android Device (Smartphone etc.) with Android Studio. After that we will run a simple Hello World Program.
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.

747 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now