commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sebb (JIRA)" <j...@apache.org>
Subject [jira] [Reopened] (LANG-1077) [PATCH] StringUtils.ordinalIndexOf("aaaaaa", "aa", 2) != 3 in StringUtils
Date Fri, 11 Dec 2015 12:50:10 GMT

     [ https://issues.apache.org/jira/browse/LANG-1077?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Sebb reopened LANG-1077:
------------------------
      Assignee:     (was: Bruno P. Kinoshita)

The patch that was applied was wrong.
The problem is that one cannot subtract the search length each time, unless one allows for
this in the initial index. 

This is why the initial index is set to str.len (i.e. max index +1) or -1 (min index -1);
then the first time through the loop, the original code starts at the end or start respectively.

The patched code now fails to start searching at the beginning when the search string len
> 1, see LANG-1193

> [PATCH] StringUtils.ordinalIndexOf("aaaaaa", "aa", 2)  != 3 in StringUtils
> --------------------------------------------------------------------------
>
>                 Key: LANG-1077
>                 URL: https://issues.apache.org/jira/browse/LANG-1077
>             Project: Commons Lang
>          Issue Type: Bug
>          Components: lang.*
>    Affects Versions: 3.3.2
>            Reporter: haiyang li
>              Labels: patch
>             Fix For: 3.4
>
>         Attachments: LANG-1077.patch
>
>
> {code:title= org.apache.commons.lang3.StringUtils.java|borderStyle=solid}
>         int found = 0;
>         int index = lastIndex ? str.length() : INDEX_NOT_FOUND;
>         do {
>             if (lastIndex) {
>                 index = CharSequenceUtils.lastIndexOf(str, searchStr, index - 1);
>             } else {
>                 index = CharSequenceUtils.indexOf(str, searchStr, index + 1);
>             }
>             if (index < 0) {
>                 return index;
>             }
>             found++;
>         } while (found < ordinal);
> {code}
> Should it be:
> {code:title= org.apache.commons.lang3.StringUtils.java|borderStyle=solid}
>         private static int ordinalIndexOf(final CharSequence str, final CharSequence
searchStr, final int ordinal, final boolean lastIndex) {
>         //        if (str == null || searchStr == null || ordinal <= 0) {
>         //            return INDEX_NOT_FOUND;
>         //        }
>         //        if (searchStr.length() == 0) {
>         //            return lastIndex ? str.length() : 0;
>         //        }
>         //        int found = 0;
>         //        int index = lastIndex ? str.length() : INDEX_NOT_FOUND;
>         //        do {
>         //            if (lastIndex) {
>         //                index = CharSequenceUtils.lastIndexOf(str, searchStr, index
- 1);
>         //            } else {
>         //                index = CharSequenceUtils.indexOf(str, searchStr, index + 1);
>         //            }
>         //            if (index < 0) {
>         //                return index;
>         //            }
>         //            found++;
>         //        } while (found < ordinal);
>         //        return index;
>         if (str == null || searchStr == null || ordinal <= 0) {
>             return INDEX_NOT_FOUND;
>         }
>         if (searchStr.length() == 0) {
>             return lastIndex ? str.length() : 0;
>         }
>         final int searchStrLen = searchStr.length();
>         int index = lastIndex ? str.length() : 0;
>         for (int found = 0; index >= 0;) {
>             if (lastIndex) {
>                 index = CharSequenceUtils.lastIndexOf(str, searchStr, index);
>             } else {
>                 index = CharSequenceUtils.indexOf(str, searchStr, index);
>             }
>             if (index < 0) {
>                 return INDEX_NOT_FOUND;
>             }
>             if (++found >= ordinal) {
>                 break;
>             }
>             index = lastIndex ? index - searchStrLen : index + searchStrLen;
>         }
>         return index;
>     }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message