Skip to content
Advertisement

Removing Sublist from ArrayList

For simplicity, let’s say I have an ArrayList whose indices contain exactly one single-digit integer. For instance:

6 4 5 6 0 6 3 4 1 6 1 6 0 6 8 3

I would like to filter out all occurrences of the sublist 6 0 6, such that the new list becomes:

6 4 5 3 4 1 6 1 8 3

Is there any way of doing this? Using ListIterator doesn’t seem to work for me, because I have to consider three consecutive elements collectively and I’m honestly not sure how to do that.

Here’s a skeleton of the method I have implemented:

public static void filterList(ArrayList<Integer> list) {
    ListIterator<Integer> iterator = list.listIterator();
    int elem; 
    while (iterator.hasNext()) {
        // Remove any sublist of 6 0 6
    }
}

Edit: Again, for simplicity, let’s assume there won’t be cases where we have 60606 or similar.

Advertisement

Answer

You can create an efficient and concise O(nm) solution by using Collections.indexOfSubList:

public static void removeAllSubList(List<?> list, List<?> subList) {
    // find first occurrence of the subList in the list, O(nm)
    int i = Collections.indexOfSubList(list, subList);
    // if found
    if (i != -1) {
        // bulk remove, O(m)
        list.subList(i, i + subList.size()).clear();
        // recurse with the rest of the list
        removeAllSubList(list.subList(i, list.size()), subList);
    }
}

Ideone Demo

User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement