You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Gerhard Maree <Ge...@fidentia.co.za> on 2007/08/15 15:59:32 UTC

New method in org.apache.commons.lang.StringUtils

Hi

I have a method that I would like to contribute to the StringUtils
class. I unfortunately can't access a CVS server on the internet, so I
included the method and its test in this mail. I'd appreciate it if
someone can have a look and add the source if it is acceptable. 

The method basically replaces multiple strings in a String, but is very
efficient. The description of the method is in the Javadoc.

Regards,
Gerhard
 
Here is method to add to org.apache.commons.lang.StringUtils

    /**
     * <p>Replace all occurrences of multiple strings in a string.</p>
     * 
     * <p>It is functionally equivalent to calling 
     *  replaceAll(searchString, replaceString) repeatedly on
<code>text</code> 
     *  for all the strings you want to replace, but much faster </p>
     *  
     * <p><code>replaceMap</code> maps search strings to replacement
strings.
     * Each key in the map will be replaced by its value in
<code>text</code>.
     * </p>
     * 
     * @param text String to replace strings in. May be null
     * @param replaceMap Maps search strings to replacement strings.  
     * @return string with all values replaced. <code>null</code> if 
     *          text was null
     */
    public static String replace(String text, Map replaceMap) {
      if(isEmpty(text)) {
        return text;
      }
      StringBuffer buff = new StringBuffer(text.length());
      //map each replace string and it's next position in text
      TreeMap indexMap = new TreeMap();
      //populate indexMap with it's initial values
      for (Iterator iter = replaceMap.keySet().iterator();
iter.hasNext();) {
        String key = (String) iter.next();
        if(isBlank(key)) {
          continue;
        }
        int idx = text.indexOf(key);
        if(idx >= 0) {
          indexMap.put(new Integer(idx), key);
        }
      }
      
      //if there is nothing to replace
      if(indexMap.isEmpty()) return text;
      
      int prevIdx = 0;
      while(indexMap.size() > 0) {
        Integer idxI = (Integer)indexMap.firstKey();
        int idx = idxI.intValue();
        String keyS = (String)indexMap.remove(idxI);
        buff.append(text.substring(prevIdx, idx));
        buff.append((String)replaceMap.get(keyS));
        prevIdx = idx + keyS.length();
        idx = text.indexOf(keyS, prevIdx);
        if(idx > 0) {
          indexMap.put(new Integer(idx), keyS);
        }
      }
      buff.append(text.substring(prevIdx));
      return buff.toString();
    }


Here is the test method to add to StringUtilsTest.


    public void testReplace_StringMap() {
      Map replaceMapEmpty = new HashMap();
      Map replaceMap1 = new HashMap();
      replaceMap1.put("foo", "bar");
      replaceMap1.put("boo", "far");
      Map replaceMap2 = new HashMap();
      replaceMap2.put("foo", "");
      Map replaceMap3 = new HashMap();
      replaceMap3.put("", "foo");
      
      assertEquals(null, StringUtils.replace(null,  replaceMapEmpty));
      assertEquals(null, StringUtils.replace(null, replaceMap1));

      assertEquals("", StringUtils.replace("", replaceMapEmpty));
      assertEquals("", StringUtils.replace("", replaceMap1));

      assertEquals("foo", StringUtils.replace("foo", replaceMapEmpty));
      assertEquals("bar", StringUtils.replace("foo", replaceMap1));
      assertEquals("", StringUtils.replace("foo", replaceMap2));
      assertEquals("foo", StringUtils.replace("foo", replaceMap3));
      
      assertEquals("foobar", StringUtils.replace("foobar",
replaceMapEmpty));
      assertEquals("barbar", StringUtils.replace("foobar",
replaceMap1));
      assertEquals("bar", StringUtils.replace("bar", replaceMap2));

      assertEquals("fobar", StringUtils.replace("fobar", replaceMap1));
      assertEquals("barobar", StringUtils.replace("fooobar",
replaceMap1));
      assertEquals("barbar", StringUtils.replace("foofoo",
replaceMap1));
      assertEquals("barfar", StringUtils.replace("fooboo",
replaceMap1));
      assertEquals("barfarbarfar", StringUtils.replace("fooboofooboo",
replaceMap1));
      assertEquals("barbarfarfar", StringUtils.replace("foofoobooboo",
replaceMap1));
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Re: New method in org.apache.commons.lang.StringUtils

Posted by Henri Yandell <fl...@gmail.com>.
Hi Gerhard,

Thanks for the suggestion. Could I ask you to create a JIRA item for it?

Lang improvements (as opposed to bugs) tend to be a case of getting
them in JIRA, and then seeing what people think over time.

http://issues.apache.org/jira/browse/LANG

Thanks,

Hen

On 8/15/07, Gerhard Maree <Ge...@fidentia.co.za> wrote:
>
> Hi
>
> I have a method that I would like to contribute to the StringUtils
> class. I unfortunately can't access a CVS server on the internet, so I
> included the method and its test in this mail. I'd appreciate it if
> someone can have a look and add the source if it is acceptable.
>
> The method basically replaces multiple strings in a String, but is very
> efficient. The description of the method is in the Javadoc.
>
> Regards,
> Gerhard
>
> Here is method to add to org.apache.commons.lang.StringUtils
>
>     /**
>      * <p>Replace all occurrences of multiple strings in a string.</p>
>      *
>      * <p>It is functionally equivalent to calling
>      *  replaceAll(searchString, replaceString) repeatedly on
> <code>text</code>
>      *  for all the strings you want to replace, but much faster </p>
>      *
>      * <p><code>replaceMap</code> maps search strings to replacement
> strings.
>      * Each key in the map will be replaced by its value in
> <code>text</code>.
>      * </p>
>      *
>      * @param text String to replace strings in. May be null
>      * @param replaceMap Maps search strings to replacement strings.
>      * @return string with all values replaced. <code>null</code> if
>      *          text was null
>      */
>     public static String replace(String text, Map replaceMap) {
>       if(isEmpty(text)) {
>         return text;
>       }
>       StringBuffer buff = new StringBuffer(text.length());
>       //map each replace string and it's next position in text
>       TreeMap indexMap = new TreeMap();
>       //populate indexMap with it's initial values
>       for (Iterator iter = replaceMap.keySet().iterator();
> iter.hasNext();) {
>         String key = (String) iter.next();
>         if(isBlank(key)) {
>           continue;
>         }
>         int idx = text.indexOf(key);
>         if(idx >= 0) {
>           indexMap.put(new Integer(idx), key);
>         }
>       }
>
>       //if there is nothing to replace
>       if(indexMap.isEmpty()) return text;
>
>       int prevIdx = 0;
>       while(indexMap.size() > 0) {
>         Integer idxI = (Integer)indexMap.firstKey();
>         int idx = idxI.intValue();
>         String keyS = (String)indexMap.remove(idxI);
>         buff.append(text.substring(prevIdx, idx));
>         buff.append((String)replaceMap.get(keyS));
>         prevIdx = idx + keyS.length();
>         idx = text.indexOf(keyS, prevIdx);
>         if(idx > 0) {
>           indexMap.put(new Integer(idx), keyS);
>         }
>       }
>       buff.append(text.substring(prevIdx));
>       return buff.toString();
>     }
>
>
> Here is the test method to add to StringUtilsTest.
>
>
>     public void testReplace_StringMap() {
>       Map replaceMapEmpty = new HashMap();
>       Map replaceMap1 = new HashMap();
>       replaceMap1.put("foo", "bar");
>       replaceMap1.put("boo", "far");
>       Map replaceMap2 = new HashMap();
>       replaceMap2.put("foo", "");
>       Map replaceMap3 = new HashMap();
>       replaceMap3.put("", "foo");
>
>       assertEquals(null, StringUtils.replace(null,  replaceMapEmpty));
>       assertEquals(null, StringUtils.replace(null, replaceMap1));
>
>       assertEquals("", StringUtils.replace("", replaceMapEmpty));
>       assertEquals("", StringUtils.replace("", replaceMap1));
>
>       assertEquals("foo", StringUtils.replace("foo", replaceMapEmpty));
>       assertEquals("bar", StringUtils.replace("foo", replaceMap1));
>       assertEquals("", StringUtils.replace("foo", replaceMap2));
>       assertEquals("foo", StringUtils.replace("foo", replaceMap3));
>
>       assertEquals("foobar", StringUtils.replace("foobar",
> replaceMapEmpty));
>       assertEquals("barbar", StringUtils.replace("foobar",
> replaceMap1));
>       assertEquals("bar", StringUtils.replace("bar", replaceMap2));
>
>       assertEquals("fobar", StringUtils.replace("fobar", replaceMap1));
>       assertEquals("barobar", StringUtils.replace("fooobar",
> replaceMap1));
>       assertEquals("barbar", StringUtils.replace("foofoo",
> replaceMap1));
>       assertEquals("barfar", StringUtils.replace("fooboo",
> replaceMap1));
>       assertEquals("barfarbarfar", StringUtils.replace("fooboofooboo",
> replaceMap1));
>       assertEquals("barbarfarfar", StringUtils.replace("foofoobooboo",
> replaceMap1));
>      }
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org