java substring(1,2) issue

Hi,

I am working on below challenge
http://codingbat.com/prob/p151713

I wrote as below
public boolean mixStart(String str) {
  
  if((str.substring(1,2)).equals("ix")){
  return true;
  }
  return false;
}

Open in new window


I passed one test and failed other test cases as below



Expected      Run            
mixStart("mix snacks") → true      false      X         
mixStart("pix snacks") → true      false      X         
mixStart("piz snacks") → false      false      OK         
mixStart("nix") → true      false      X         
mixStart("ni") → false      false      OK         
mixStart("n") → false      Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: 2 (line number:3)      X         
mixStart("") → false      Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: 2 (line number:3)      X         

I thought substring(1,2) will check for string"ix" and simply retun true in that case. Looks like something is wrong with my assumption. How to improve above code. Please advise
LVL 7
gudii9Asked:
Who is Participating?
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.

dpearsonCommented:
You're very close.

substring(1,2) returns the string starting at index 1 and ending at index 2 - so it's just checking 1 character, not 2.

Try this instead:

public boolean mixStart(String str) {
  if ((str.substring(1,3)).equals("ix")){
  return true;
  }
  return false;
}

It's still not quite correct.  You'll get the exceptions about "index out of range" when passing in a short string.

Can you see how to fix those cases?

Doug
0
CEHJCommented:
Substringing is unnecessary:

public boolean mixStart(String str) {
    return str.indexOf("ix") == 1;
}

Open in new window

0
gudii9Author Commented:
public boolean mixStart(String str) {
  if ((str.substring(1,3)).equals("ix")){
  return true;
  }
  return false;
}

Open in new window


when i tried as above i have some test cases failing as below


Expected      Run            
mixStart("mix snacks") → true      true      OK         
mixStart("pix snacks") → true      true      OK         
mixStart("piz snacks") → false      false      OK         
mixStart("nix") → true      true      OK         
mixStart("ni") → false      Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: 3 (line number:2)      X         
mixStart("n") → false      Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: 3 (line number:2)      X         
mixStart("") → false      Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: 3 (line number:2)      X       



I do not see any specific requirement for small strings of 2 or 1 etc characters in the challenge.


Return true if the given string begins with "mix", except the 'm' can be anything, so "pix", "9ix" .. all count.

mixStart("mix snacks") → true
mixStart("pix snacks") → true
mixStart("piz snacks") → false

Please advise
0
Cloud Class® Course: SQL Server Core 2016

This course will introduce you to SQL Server Core 2016, as well as teach you about SSMS, data tools, installation, server configuration, using Management Studio, and writing and executing queries.

gudii9Author Commented:
return str.indexOf("ix") == 1;

Open in new window


what is meaning of above line? Does it simply check if 'ix' is there in the given string 'str'?
Please advise
0
dpearsonCommented:
I do not see any specific requirement for small strings of 2 or 1 etc characters in the challenge.
It's not spelled out, but they are sending in some short strings to test the behavior.

Give this a try and then see if you can see why it fixed it:

public boolean mixStart(String str) {
  if (str.length() > 2 && (str.substring(1,3)).equals("ix")){
  return true;
  }
  return false;
}

And this line:
str.indexOf("ix") == 1;
checks to see if "ix" is within the string...and also if it's in position 1.  Can you see how that would solve this too?

Doug
0
gudii9Author Commented:
public boolean mixStart(String str) {
  if (str.length() > 2 && (str.substring(1,3)).equals("ix")){
  return true;
  }
  return false;
}

Open in new window


solving all test cases


Also

public boolean mixStart(String str) {
    return str.indexOf("ix") == 1;
}

Open in new window

above also passing all test cases


And this line:
str.indexOf("ix") == 1;

checks to see if "ix" is within the string...and also if it's in position 1.

ix position check 1 means checking the starting position of i right(which is the first letter in ix?)
Please advise
0
ozoCommented:
Do you understand the documentation for the indexOf function?
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#indexOf%28java.lang.String%29
0
gudii9Author Commented:
I was reading it now.

The returned index is the smallest value k for which:

 k >= fromIndex && this.startsWith(str, k)

what it means by above line?
0
dpearsonCommented:
ix position check 1 means checking the starting position of i right(which is the first letter in ix?)
Yes that's right.

It's the position in the string where the substring ("ix") starts.
0
ozoCommented:
k >= fromIndex
means k is greater than or equal to k >= fromIndex

this.startsWith(str, k) is documented here:
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#startsWith%28java.lang.String,%20int%29

The returned index is the smallest value k for which:
means that there is no smaller value for which this is true
i.e. if there is more than one value which satisfies it, we choose the smallest one.
0
gudii9Author Commented:
i need to read more
0
gudii9Author Commented:
i never used regular expressions. I wonder i can do programming without knowing regular expression? May be it is easy to learn regular expression with java background. please advise
0
ozoCommented:
You can do  programming without knowing regular expressions.
You can do  programming without knowing the java.math library.
Although awareness of them can be generally helpful.
Without them some things may become more inconvenient to do, and in solving some problems
you may find yourself reinventing them, perhaps in non-standard ways that make it harder
for you to communicate your solutions with others.
And even if the problem at hand is not one in which use of either is appropriate,
a general awareness of the landscape can give one a better perspective.
But there are still a lot of places to explore even avoiding particular areas.
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
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.