You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "jefferyyuan (JIRA)" <ji...@apache.org> on 2015/10/24 09:04:27 UTC

[jira] [Created] (LANG-1176) Improve ArrayUtils removeElements

jefferyyuan created LANG-1176:
---------------------------------

             Summary: Improve ArrayUtils removeElements
                 Key: LANG-1176
                 URL: https://issues.apache.org/jira/browse/LANG-1176
             Project: Commons Lang
          Issue Type: Bug
          Components: lang.*
    Affects Versions: 3.4
            Reporter: jefferyyuan
            Priority: Minor
             Fix For: 3.5


The current ArrayUtils removeElements implementation is not efficient when try to get all indexes that needed to be removed.

It's O(m*n): n is the length of origin array, m is the unique count of toBeRemoved.
        final BitSet toRemove = new BitSet();
        for (final Map.Entry<Byte, MutableInt> e : occurrences.entrySet()) {
            final Byte v = e.getKey();
            int found = 0;
            for (int i = 0, ct = e.getValue().intValue(); i < ct; i++) {
                found = indexOf(array, v.byteValue(), found);
                if (found < 0) {
                    break;
                }
                toRemove.set(found++);
            }
        }

We can just scan the origin array once to get all indexes that needed to be removed.
        final BitSet toRemove = new BitSet();
        for (final Map.Entry<Integer, MutableInt> e : occurrences.entrySet()) {
            final Integer v = e.getKey();
            int found = 0;
            for (int i = 0, ct = e.getValue().intValue(); i < ct; i++) {
                found = indexOf(array, v.intValue(), found);
                if (found < 0) {
                    break;
                }
                toRemove.set(found++);
            }
        }



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