substring example to delte string

Hi

I am trying below challenge

http://codingbat.com/prob/p100905

I wrote as below


public String delDel(String str) {
  if((str.substring(1)).equals("del")){
  return str-"del";
  }
  return str;
}


what is the best way to see 'del' is there in given string and delete from exact same location. 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.

ozoCommented:
return str.replaceFirst("(?<=^.)del","");
0
dpearsonCommented:
You can't use the "-" operator to remove the string.

But you can build up the string with a piece missing like this:
  return str.substring(0, pos) + str.substring(pos+3) ;
which returns the string to position 'pos', plus the string from 'pos+3' to the end - which means the string but with 3 characters removed at position 'pos'.

Using that you can do this:

public String delDel(String str) {
  int pos = str.indexOf("del") ;
  if (pos == -1 || pos != 1)
     return str ;
  return str.substring(0, pos) + str.substring(pos+3) ;
}
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
gudii9Author Commented:
?<=^.

what is meaning of above code.

Is it is some kind of regular expression. Please advise
0
Cloud Class® Course: MCSA MCSE Windows Server 2012

This course teaches how to install and configure Windows Server 2012 R2.  It is the first step on your path to becoming a Microsoft Certified Solutions Expert (MCSE).

rrzCommented:
First let's explain your errors.
if((str.substring(1)).equals("del")){

Open in new window

This won't work because str.substring(1) is the entire String minus the first character.
return str-"del";

Open in new window

This won't work because you can't use the - operator in that way. You can use the + operator for concatenating Strings. But you can't subtract with - operator.  ozo's solution is good.  But, the following is easier to understand.
public String delDel(String str) {
    if(str.length()>3 && (str.substring(1,4)).equals("del")){
       return str.replaceFirst("del","");
   }
   return str;
}

Open in new window

0
rrzCommented:
Using dpearson's and ozo's ideas, here is another solution.
public String delDel(String str) {
    if(str.indexOf("del") == 1){       
         return str.replaceFirst("del","");
    }
    return str; 
}

Open in new window

0
CEHJCommented:
Another way:
public String delDel(String str) {
   StringBuilder sb = new StringBuilder(str);
   int ixDel = sb.indexOf("del");
   return ixDel == 1? sb.delete(ixDel, 4).toString() : str;
}

Open in new window

0
ozoCommented:
Or, if you want to avoid calling StringBuilder unnecessarily:
   return str.indexOf("del") == 1? new StringBuilder(str).delete(1, 4).toString() : str;
0
CEHJCommented:
He he - good one ;)
0
gudii9Author Commented:
 if (pos == -1 || pos != 1)


why are we checking pos is not equal to 1 as above. Please advise
0
gudii9Author Commented:
 return str.indexOf("del") == 1? new StringBuilder(str).delete(1, 4).toString() : str;

Open in new window


why are we checking indexOf("del") is 1 or not as above then if it then delete(1,4). Otherwise return same string

Please advise
0
gudii9Author Commented:
return ixDel == 1? sb.delete(ixDel, 4).toString() : str;

Open in new window



why we have given 4 as argument of delete method. I thought it should have been 3.



All the test cases passed as below

public String delDel(String str) {
   StringBuilder sb = new StringBuilder(str);
   int ixDel = sb.indexOf("del");
   return ixDel == 1? sb.delete(ixDel, 4).toString() : str;
}

Open in new window


Expected      Run            
delDel("adelbc") → "abc"      "abc"      OK         
delDel("adelHello") → "aHello"      "aHello"      OK         
delDel("adedbc") → "adedbc"      "adedbc"      OK         
delDel("abcdel") → "abcdel"      "abcdel"      OK         
delDel("add") → "add"      "add"      OK         
delDel("ad") → "ad"      "ad"      OK         
delDel("a") → "a"      "a"      OK         
delDel("") → ""      ""      OK         
delDel("del") → "del"      "del"      OK         
delDel("adel") → "a"      "a"      OK         
delDel("aadelbb") → "aadelbb"
0
gudii9Author Commented:
str.replaceFirst("del","");

Open in new window


I was checking the API
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html

I wonder why there is no replaceLast method similar to replaceFirst.
Please advise
0
dpearsonCommented:
if (pos == -1 || pos != 1)
why are we checking pos is not equal to 1 as above. Please advise

The problem said "if the string "del" appears starting at index 1" so checking if (pos != 1) is checking for whether the string is at index 1.

Looking at this I realize I made it more complex than it needs to be because of course if "pos == -1" then that means "pos != 1" is true, so we can just write this as:

if (pos != 1) ...

I wonder why there is no replaceLast method similar to replaceFirst.
This is just because the people who wrote Java (Sun) thought that it would be more common for people to want to replace the first string that matches a pattern rather than the last string.  When designing classes and methods there's a lot of asking "how will people most often want to use this" and that shows up in the design.  They certainly could have added a "replaceLast" method.  They just didn't think it would be used that often.

Doug
0
CEHJCommented:
why are we checking indexOf("del") is 1 or not as above then if it then delete(1,4). Otherwise return same string

Please advise

Because that is what's specified
0
gudii9Author Commented:
return str.replaceFirst("(?<=^.)del","");

what is meaning of ?<=^.

Please advise
0
gudii9Author Commented:
I checked api

String      replaceFirst(String regex, String replacement)
Replaces the first substring of this string that matches the given regular expression with the given replacement

It did not talk about ?<=^.

please advise
0
ozoCommented:
0
gudii9Author Commented:
i need to read it more
0
rrzCommented:
To explain (?<=^.)del  
You could read
http://www.regular-expressions.info/lookaround.html
0
gudii9Author Commented:
public String delDel(String str) {
   StringBuilder sb = new StringBuilder(str);
   int ixDel = sb.indexOf("del");
   return ixDel == 1? sb.delete(ixDel, 4).toString() : str;
}


As above it is all working fine.
Below line

return ixDel == 1? sb.delete(ixDel, 4).toString() : str;

why we have given 4 as argument of delete method. I thought it should have been 3.
0
rrzCommented:
Look at the API  
http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html#delete(int,%20int)   
it says
end - The ending index, exclusive.
Therefore the end index is excluded from the delete.
So, if we want to delete "del" at index 1,2,3,  then we should use 4 for end
0
dpearsonCommented:
Yeah - the key part as rrz mentioned is that the "end index" does NOT include that position.

This is true for all of the string operations.

So delete(0,1) means "delete the character starting at position 0 and ending BEFORE position 1" - so just 1 character at position 0.

etc.

Doug
0
gudii9Author Commented:
replace
public StringBuilder replace(int start,
                    int end,
                    String str)
Replaces the characters in a substring of this sequence with characters in the specified String. The substring begins at the specified start and extends to the character at index end - 1 or to the end of the sequence if no such character exists. First the characters in the substring are removed and then the specified String is inserted at start. (This sequence will be lengthened to accommodate the specified String if necessary.)
Parameters:
start - The beginning index, inclusive.
end - The ending index, exclusive.
str - String that will replace previous contents.
Returns:
This object.
Throws:
StringIndexOutOfBoundsException - if start is negative, greater than length(), or greater than end.

I see replace function also has end exclusive.

What other functions of String has end as exclusive apart from delete, replace. please advise
0
dpearsonCommented:
Any string function that takes a range (e.g. substring) always has the end index being exclusive.

It would be very confusing if some of them weren't.  They're all the same.
0
gudii9Author Commented:
StringBuilder      delete(int start, int end)
Removes the characters in a substring of this sequence.

I see one other in StringBuilder with end exclusive
0
CEHJCommented:
I see one other in StringBuilder with end exclusive
That's the point - the end is exclusive
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 EE

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.