gpt4 book ai didi

集合的 Java 可修改 View

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:34:46 26 4
gpt4 key购买 nike

我正在寻找解决以下问题的方法:
从集合 A 开始,我想将该集合(比如集合 B)的某种“ View ”传递给某个方法。 View B 不一定包含原始集合 A 的所有元素。如果在此方法中将对象添加到 View (集合 B)或从 View (集合 B)中删除,则这些更改也应反射(reflect)在原始集合 A 上。

例如(伪代码):

  1. 开始情况:

    Collection A = {1, 2, 3};  
    View-on-collection B = {1, 2};
  2. 方法调用:

    someMethod(B) {  
    B.add(4);
    B.remove(2);
    }
  3. 结束情况:

    Collection A = {1, 3, 4};

有人知道这个问题的巧妙解决方案吗?

最佳答案

一种方法是使用 List.sublist() :

public static void main(String[] args) {
List<Integer> aList = new ArrayList<Integer>(Arrays.asList(1,2,3));
List<Integer> view = aList.subList(0, 2);

view.add(new Integer(4));
view.remove(new Integer(2));
System.out.println("aList: " + aList);
System.out.println("view : " + view);
}

另一种更通用的方法是通过 Guavas Collections2.filter() ,它允许您定义一个谓词来控制哪些对象应该在 View 中:

public static void main(String[] args) {

List<Integer> aList = new ArrayList<Integer>(Arrays.asList(1,2,3));
@SuppressWarnings("unchecked")
Collection<Integer> view = Collections2.filter(aList, new Predicate() {
public boolean apply(Object arg0) {
return ((Integer) arg0).intValue() % 3 != 0;
}});
view.add(new Integer(4));
view.remove(new Integer(2));
System.out.println("aList: " + aList);
System.out.println("view : " + view);

}

两个例子都打印

aList: [1, 4, 3]
view : [1, 4]

关于集合的 Java 可修改 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12281533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com