java - 如何在 JAVA 中将元素添加到另一个列表(或 vector )时自动将其添加到一个列表(或 vector )

标签 java list vector

假设我有两个列表(或 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 的元素,而且我可以包含 l3l4 > 以及...以及任何时候我修改(添加或删除)元素 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/

相关文章:

java - arrayList 存储了 2 个以上的对象,如果用户搜索它们如何获得返回

Java利用多个IP使用线程进行网页爬取

java - 声明一个具有多种类型的 ArrayList

r - 在循环中 append 列表 (R)

java - 如何在扫描下一步之前检查扫描仪是否有输入

java - Jersey 客户端不等待 GET 方法的结果

c++ - 当通知迭代器参数初始化为空列表的开头时,list::insert 的行为是什么?

c++ - vector 迭代器不兼容 : DEBUG

c++ - DirectX::XMVECTOR 函数 XMVectorSetByIndex() 未设置 float (C++)

C++ vector 字面量,或类似的东西