我需要创建一个没有另一个arraylist元素的arraylist,但是我需要这个新的arraylist来保持更新。例如,旧数组列表中的一个元素被删除,新数组中的一个也被删除。
但是我不想删除两个arraylist的元素,只删除旧的一个,以便没有太多代码
(我的方法“ showPeople”每1秒更新一次)
我的代码:
ArrayList<Person> personList = new ArrayList<>();
private void method(){
personList.add(new People("Name"))
}
private void showPeople(){
ArrayList<Person> newPersonList =
new ArrayList<>(personList.stream()
.filter(person -> !person.getName().equals("Test"))
.collect(Collectors.toList()))
for (int i = 0; i < newPersonList.size(); i++){
gui.show(newPersonList.get(i).getName());
}
}
问题是,当我创建新的数组列表并从旧列表中删除一项时,新列表不会更新
答案 0 :(得分:2)
您正在制作列表的多个副本;相反,请执行以下操作:
package program;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
public class TempList {
public static void main(String[] args) {
/*************************************************/
/****************Assigning Values*****************/
/*************************************************/
String[] names = {
"A",
"B",
"C",
"D",
"E"
};
List < ComparableTest > objects = new LinkedList < > ();
/*************************************************/
/****************Printing Values******************/
/*************************************************/
for (String name: names) {
objects.add(new ComparableTest(name, new Random().nextInt(100)));
}
System.out.println("Before Sorting");
for (ComparableTest object: objects) {
System.out.println(object.name + " " + object.marks);
}
/*************************************************/
/*************Sorting based on marks**************/
/*************************************************/
Collections.sort(objects);
System.out.println("\nSorting based on Marks");
for (ComparableTest object: objects) {
System.out.println(object.name + " " + object.marks);
}
/*************************************************/
/*************Sorting based on names**************/
/*************************************************/
System.out.println("\nSorting based on Names");
Collections.sort(objects, new Comparator < ComparableTest > () {
@Override
public int compare(ComparableTest o1, ComparableTest o2) {
if (o1.name.compareTo(o2.name) < 1) {
return 1;
}
return -1;
}
});
for (ComparableTest object: objects) {
System.out.println(object.name + " " + object.marks);
}
}
}
如果您对List<Person> filterPeople(List<Person> people, @NotNull String name) {
return people.stream()
.filter(person -> !name.equals(person.getName()))
.collect(Collectors.toList());
}
的形状缺乏保证感到不满意,则可以明确:
List
但是,您仍然不清楚您要问什么。建议您提供一个minimal, complete, and verifiable example。
答案 1 :(得分:0)
如果希望不带元素的列表不断更新,则可以通过扩展AbstractList
来创建列表视图。
API文档包含有关您需要覆盖的方法的说明。如果您不希望通过视图修改列表,则只需重写get
和size
方法即可:
class ListView extends AbstractList<String> {
private final List<String> delegate; // Initialize in constructor.
public T get(int i) {
int pos = delegate.indexOf("Test");
if (pos < 0 || i < pos) return delegate.get(i);
return delegate.get(i + 1);
}
public int size() {
return delegate.size() - (delegate.contains("Test") ? 1 : 0);
}
}
这将重复搜索"Test"
元素,因为该视图无法知道委托列表下方是否已更新。
答案 2 :(得分:-1)
您可以使用:List<String> elements = list.stream().distinct().collect(Collectors.toList());
这样会删除重复项。