Классы TestListRemoveFunctional & TestListRemoveUpdateState выполняет фильтрацию во время выполнения LinkedList.Предпочтительный метод фильтрации LinkedList
Я думаю, что реализация TestListRemoveFunctional чиста, поскольку она не обновляет состояние, но менее эффективна, так как создает новый список на каждом этапе фильтрации.
Хотя TestListRemoveFunctional & TestListRemoveUpdateState по существу выполняют ту же работу, TestListRemoveFunctional является предпочтительным, так как он не обновляет состояние, в отличие от фильтрации в реализации TestListRemoveUpdateState.
Обратите внимание, что я не могу использовать java8 lambdas или проект Guava lambdas.
Можете подтвердить мое утверждение, что TestListRemoveFunctional предпочтительнее?
import java.util.LinkedList;
public class TestListRemoveFunctional {
public static void main(String args[]) {
TestListRemoveFunctional t = new TestListRemoveFunctional();
LinkedList<MyObj> l = new LinkedList<MyObj>();
l.add(new MyObj("1"));
l.add(new MyObj("2"));
System.out.println("size : "+l.size());
LinkedList<MyObj> f1 = t.filterItem1(l);
System.out.println("size : "+f1.size());
LinkedList<MyObj> f2 = t.filterItem2(f1);
System.out.println("size : "+f2.size());
}
private LinkedList<MyObj> filterItem1(LinkedList<MyObj> l) {
LinkedList<MyObj> toReturn = new LinkedList<MyObj>();
for (MyObj myObj : l) {
if (!myObj.param.equalsIgnoreCase("1")) {
toReturn.add(myObj);
}
}
return toReturn;
}
private LinkedList<MyObj> filterItem2(LinkedList<MyObj> l) {
LinkedList<MyObj> toReturn = new LinkedList<MyObj>();
for (MyObj myObj : l) {
if (!myObj.param.equalsIgnoreCase("2")) {
System.out.println(myObj.param);
toReturn.add(myObj);
}
}
return toReturn;
}
private static class MyObj {
public String param;
public MyObj(String param) {
this.param = param;
}
}
}
********************************************************************************************
import java.util.Iterator;
import java.util.LinkedList;
public class TestListRemoveUpdateState {
public static void main(String args[]) {
TestListRemoveUpdateState t = new TestListRemoveUpdateState();
LinkedList<MyObj> l = new LinkedList<MyObj>();
l.add(new MyObj("1"));
l.add(new MyObj("2"));
System.out.println("size is : " + l.size());
t.filterItem1(l);
System.out.println("size is : " + l.size());
t.filterItem2(l);
System.out.println("size is : " + l.size());
}
private void filterItem1(LinkedList<MyObj> l) {
Iterator<MyObj> iter = l.iterator();
while (iter.hasNext()) {
MyObj myObj = iter.next();
if (myObj.param.equalsIgnoreCase("1")) {
iter.remove();
}
}
}
private void filterItem2(LinkedList<MyObj> l) {
Iterator<MyObj> iter = l.iterator();
while (iter.hasNext()) {
MyObj myObj = iter.next();
if (myObj.param.equalsIgnoreCase("2")) {
iter.remove();
}
}
}
private static class MyObj {
public String param;
public MyObj(String param) {
this.param = param;
}
}
}
, хотя если бы вы должны были фильтровать ArrayList, вы бы не использовали remove, а вместо этого заменяли выпавшие элементы (чтобы удалить их при окончательном изменении размера), поэтому снова очень эффективно – BeyelerStudios
Я не думаю, что это отвечает на вопрос. Вы сравниваете производительность 'remove' между связанным списком и списком массивов, в то время как вопрос заключается в удалении элемента из списка с использованием двух подходов: поскольку вы выполняете итерацию через него или создаете новый список с отфильтрованными элементами. –
@VivinPaliath Нет. Я не сравниваю эффективность между '' ArrayList' и '' LinkedList'', я просто добавил боковое примечание, чтобы показать, что предпочтительный метод будет отличаться от '' ArrayList''. –