2015-10-24 3 views
0

В настоящее время, когда я хочу отфильтровать список, я использую для итерации по его элементам и копирования элементов, соответствующих моим требованиям, в новый список, но таким образом я использую O (2N) пространственной сложности. Есть ли более эффективный способ сделать это?Что является самым простым способом фильтрации списка на Java?

ответ

1

Если вы используете Java 8, вы можете просто использовать myList.stream(). Filter(); В противном случае вы можете принять Filter Pattern.

public abstract class Filter<T> { 
public abstract boolean passes(T object); 
public Iterator<T> filter(Iterator<T> iterator) { 
return new FilterIterator(iterator); 
    } 
    public Iterable<T> filter(Iterable<T> iterable) { 
    return new Iterable<T>() { 
    public Iterator<T> iterator() { 
    return filter(iterable.iterator()); 
    } 
    }; 
} 
private class FilterIterator implements Iterator<T> { 
private Iterator<T> iterator; 
private T next; 
private FilterIterator(Iterator<T> iterator) { 
    this.iterator = iterator; 
    toNext(); 
} 
public boolean hasNext() { 
    return next != null; 
} 
public T next() { 
    if (next == null) 
    throw new NoSuchElementException(); 
    T returnValue = next; 
    toNext(); 
    return returnValue; 
} 
public void remove() { 
    throw new UnsupportedOperationException(); 
} 
private void toNext() { 
    next = null; 
    while (iterator.hasNext()) { 
    T item = iterator.next(); 
    if (item != null && passes(item)) { 
     next = item; 
     break; 
    } 
    } 
} 
} 
} 
0

Вы всегда будете иметь O (2N) пространственную сложность, если вам нужно сохранить старый список, а также построить новый список.

Если вам не нужно делать глубокую копию, храните ссылки в новом списке. То есть внутри вашей петли вместо чего-то вроде newlist.add(item.deepClone()), просто сделайте newlist.add(item).

Если вам не нужно хранить старый список, вы можете выбросить элементы, которые не соответствуют вашим требованиям. Например. внутри вашей петли вместо if (isAKeeper(item)) newlist.add(...), используйте if (!isAKeeper(item)) oldList.remove(item).

Смежные вопросы