2015-12-24 3 views
1

Я пытаюсь написать метод, который при передаче арраиста вернет новый arraylist, содержащий только элементы, соответствующие заданному условию (без использования итерации). класс коллекции имеет removeIf, который похож, но я ищу «copyIf», если такая функциональность существует. ex:clone collection members matching condition

public class Foo { 
    public int value; 
    public Foo(int val){ 
    value = val; 
    } 
} 

public class Bar { 
    private ArrayList<Foo> refList; 
    public ArrayList<Foo> overTwentyList; 

    public Bar(){ 
    refList = new ArrayList<Foo>(); 
    refList.add(new Foo(12)); 
    refList.add(new Foo(23)); 
    refList.add(new Foo(6)); 
    refList.add(new Foo(44)); 
    refList.add(new Foo(2)); 
    refList.add(new Foo(19)); 
    refList.add(new Foo(99)); 
    refList.add(new Foo(74)); 

    overTwentyList = overTwenty(refList); 
    // now overTwentyList would contain only Foo members 
    // with values 23, 44, 99, 74 and refList would retain 
    // all values 
    } 

    public ArrayList<Foo> overTwenty(ArrayList<Foo> bankList){ 
    // bankList filter code here 
    // normally i would use iteration but i think 
    // calling this method frequently would eat a lot 
    // of system resources if it iterates every time 
    return filteredList; 
    } 
} 
+1

не повторив? в фоновом режиме почти всегда повторяется. –

ответ

0

Я бы рекомендовал посмотреть библиотеку google-guava. Существует большая поддержка работы с коллекциями.

2

Несомненно, over twenty список только, что копия списка все under twenty записей удалены. Вы можете сделать это, используя removeIf.

public ArrayList<Foo> overTwenty(ArrayList<Foo> bankList) { 
     // Take a complete copy. 
     ArrayList<Foo> filtered = new ArrayList<>(bankList); 
     // Remove the under 20s. 
     filtered.removeIf(a -> a.value <= 20); 
     return filtered; 
    } 

Однако это все равно копирует весь список каждый раз. Чтобы избежать этого, вам понадобится немного больше халата. Будет ли приемлемым Iterable<Foo>?

public class Foo { 

    public int value; 

    public Foo(int val) { 
     value = val; 
    } 

    @Override 
    public String toString() { 
     return "Foo{" + "value=" + value + '}'; 
    } 

} 

public class Bar { 

    private ArrayList<Foo> refList; 
    public Iterable<Foo> overTwentyList; 

    public Bar() { 
     refList = new ArrayList<Foo>(); 
     refList.add(new Foo(12)); 
     refList.add(new Foo(23)); 
     refList.add(new Foo(6)); 
     refList.add(new Foo(44)); 
     refList.add(new Foo(2)); 
     refList.add(new Foo(19)); 
     refList.add(new Foo(99)); 
     refList.add(new Foo(74)); 

     overTwentyList = new OverTwenties(refList); 
    } 

    class OverTwenties implements Iterable<Foo> { 

     private final Iterable<Foo> refList; 

     private OverTwenties(ArrayList<Foo> refList) { 
      this.refList = refList; 
     } 

     @Override 
     public Iterator<Foo> iterator() { 
      return new Iterator<Foo>() { 
       Iterator<Foo> ref = refList.iterator(); 
       Foo next = null; 

       @Override 
       public boolean hasNext() { 
        while (next == null && ref.hasNext()) { 
         do { 
          next = ref.hasNext() ? ref.next() : null; 
          // Skip everything less than 20. 
         } while (next != null && next.value < 20); 
        } 
        return next != null; 
       } 

       @Override 
       public Foo next() { 
        Foo n = next; 
        next = null; 
        return n; 
       } 

      }; 
     } 

    } 

}