У меня есть один ArrayList
со многими элементами. Я хочу, чтобы он удалил из ´ArrayList´ элементы, которые не "дерево".
До настоящего времени я реализовал следующий код, который удаляет элементы, которые не деревья:
for(int i=0;i<elementosCreados.size();i++){
if( elementosCreados.get(i).compareTo("arbol")!=0){
elementosCreados.remove(i);
}
}
Как он мог бы повторно размещать элементы ´ArrayList´ для того, чтобы не было пустых положений?
Если ты используешь Java 8 или начальник, решение @CarlosMuñoz самое подходящее.
Для Java 7 или нижний, ты можешь реализовывать это используя Iterator
:
System.out.println(elementosCreados);
Iterator<String> it = elementosCreados.iterator();
while (it.hasNext()) {
String current = it.next();
if (!current.equals("arbol")) {
it.remove();
}
}
System.out.println(elementosCreados);
PodrГ-схвати использовать .stream()
и .filter()
из Java 8:
elementosCreados = elementosCreados
.stream()
.filter(x -> !x.equals("arbol"))
.collect(Collectors.toList());
java.util.stream.Collectors
– Carlos Muñoz
31.03.2016, 21:59
Если ты хочешь использовать programaciГіn функционально в версиях, предыдущих Java 8, ты можешь использовать Guava из Google, эта librerГ - позволяет тебе иметь один cГіdigo как этот:
@Test
public void testArrayListFilter() {
List<String> list=new ArrayList<String>(Arrays.asList("perro","gato","arbol","leon"));
Iterables.removeIf(list, new Predicate<String>() {
@Override
public boolean apply(String element) {
if(element.equals("arbol")) {
return true;
}
return false;
}
});
assertThat(list.contains("arbol"),is(false));
assertThat(list.size(),is(3));
}
Другая с Google Guava:
List<String> list = Lists.newArrayList("arbol", "arbol", "casa", "auto");
List<String> filtrada = Lists.newArrayList(FluentIterable.from(list).filter(
Predicates.not(Predicates.equalTo("arbol"))));
Стиль жидкого программирования позволяет нам сцеплять вместе призывы к методам, делая код читабельнее 1
Замечания