假设我有两个列表(或 vector ),我希望一个包含另一个列表的所有元素,即使第二个列表稍后可以获取更多元素,它们也必须自动添加到第一个列表中。例如:
ArrayList<String> l1 = Arrays.asList("1","2"),l2 =Arrays.asList("3","4");
"missing treatement"
System.out.println(l2);
System.out.println(l1);
显示:
[3 4]
[1 2 3 4]
如果我添加到l2
list2.add("5);
System.out.println(l2);
System.out.println(l1);
我得到:
[3 4 5]
[1 2 3 4 5]
l1
不仅可以包含它自己的元素和 l2
的元素,而且我可以包含 l3
和 l4
> 以及...以及任何时候我修改(添加或删除)元素
li i>1
同样的情况也发生在l1
最佳答案
您想要的内容间接存在于 Java 中,但位于 JavaFX 方面。具体来说,您想要使用 FXCollections哪些是可观察到的
使用FXCollections.observableList(List<E> list)方法应该返回传递给函数的列表的可观察包装器。
现在对您的两个列表执行此操作
然后,为了使一个观察另一个,您可能必须切换到 JavaFX 世界的另一部分,即绑定(bind),即您可以使用以下方法将两个列表相互绑定(bind):
Bindings.bindContentBidirectional(ObservableList<E> list1, ObservableList<E> list2)
在这里,您将两个可观察列表传递给它,现在两者之间有了绑定(bind)。因此,当一个更新时,另一个也会更新,反之亦然
显示此内容的示例程序(注意我没有使用 Bindings.bindContentBidirectional(ObservableList<E> list1, ObservableList<E> list2)
因为它会急切地绑定(bind),并且如果不小心的话可能会清空两个列表):
package com.example;
import javafx.beans.binding.Bindings;
import javafx.beans.property.ListProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.util.Pair;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Main {
/**
* @param observed The list you wish to observe
* @param <T> Any type
* @return A pair of lists. The first one is the observer list and second is the observed list
*/
public static <T> Pair<List<T>, List<T>> observe(List<T> observed) {
ObservableList<T> fxObserved = FXCollections.observableArrayList(observed);
ListProperty<T> observerProperty = new SimpleListProperty<>(fxObserved);
return new Pair<>(observerProperty, fxObserved);
}
public static void main(String[] args) {
List<Integer> observed = IntStream.range(1, 11).boxed().collect(Collectors.toList());
List<Integer> observer = new ArrayList<>();
System.out.println("Before binding:");
System.out.println(String.format("Observed list contains: %s", String.join(", ", observed.stream()
.map(value -> value.toString())
.collect(Collectors.toList()))));
System.out.println(String.format("Observer list contains: %s", String.join(", ", observer.stream()
.map(value -> value.toString())
.collect(Collectors.toList()))));
// make the list observable
Pair<List<Integer>, List<Integer>> observingList = observe(observed);
observer = observingList.getKey();
observed = observingList.getValue();
System.out.println("\n\nAfter binding:");
System.out.println(String.format("Observed list contains: %s", String.join(", ", observed.stream()
.map(value -> value.toString())
.collect(Collectors.toList()))));
System.out.println(String.format("Observer list contains: %s", String.join(", ", observer.stream()
.map(value -> value.toString())
.collect(Collectors.toList()))));
observer.add(34);
observed.add(45);
System.out.println("\n\nAfter adding 34 and 45 to the lists:");
System.out.println(String.format("Observed list contains: %s", String.join(", ", observed.stream()
.map(value -> value.toString())
.collect(Collectors.toList()))));
System.out.println(String.format("Observer list contains: %s", String.join(", ", observer.stream()
.map(value -> value.toString())
.collect(Collectors.toList()))));
}
}
输出:
Before binding:
Observed list contains: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Observer list contains:
After binding:
Observed list contains: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Observer list contains: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
After adding 34 and 45 to the lists:
Observed list contains: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 34, 45
Observer list contains: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 34, 45
关于java - 如何在 JAVA 中将元素添加到另一个列表(或 vector )时自动将其添加到一个列表(或 vector ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36606368/