gpt4 book ai didi

java - 复制 ObservableList java

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:54:54 24 4
gpt4 key购买 nike

我有一个 masterData,它是一个 ObservableListfilteredData,它也是一个 ObservableList

然后,我想用它来显示设置过滤器时过滤的数据,而且还能够在必要时恢复。这是 MCVE:

package br;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

public class Main{
private static ObservableList<Foo> masterData = FXCollections.observableArrayList();
private static ObservableList<Foo> filteredData = FXCollections.observableArrayList();
static Filter filter = new Filter();
public static void addDummy(){
masterData.add(new Foo("a",1));
masterData.add(new Foo("aa",3));
masterData.add(new Foo("b",2));
masterData.add(new Foo("bb",4));
masterData.add(new Foo("c",3));
}
public static void printData(ObservableList<Foo> list){
for(Foo f: list) System.out.println(f.getName());
}
public static void main(String[] args) {
addDummy();
applyFilter(3);
printData(filteredData);
applyFilter(0);
printData(filteredData);
}
public static void applyFilter(int num){
filter.setData(masterData);
filter.setFilter(num);
filteredData = filter.getData();
}
}

我用来过滤数据的类过滤器:

package br;

import java.util.ArrayList;
import java.util.List;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

public class Filter {
private ObservableList<Foo> data = FXCollections.observableArrayList();
public void setFilter(int filter){
List<Foo> copy = new ArrayList<Foo>(data);
for(Foo f: copy)
if(f.getBar()<filter) data.remove(f);
}
public ObservableList<Foo> getData() {
return data;
}

public void setData(ObservableList<Foo> data) {
this.data = data;
}

}

还有 Foo 类,它只是一个 [String] name 和一个 [int] bar (加上 getters/setters)

package br;

public class Foo {
private String name;
private int bar;
public Foo(String name, int bar){
this.setBar(bar);
this.setName(name);
}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public int getBar() {return bar;}
public void setBar(int bar) {this.bar = bar;}
}

当你运行这段代码时,你会得到:

aa
bb
c

过滤器设置为 3(按预期过滤数据)和过滤器“重置”为零之后。

如何确保过滤器始终使用 ma​​sterData 中的数据进行处理,然后存储在 filteredData 中?

注意:这是针对 JavaFX 项目的,因此我确实需要使用 ObservableList

最佳答案

问题

public void setData(ObservableList<Foo> data) {
this.data = data;
}

解释

如果您想知道 Java 是否遵守按值传递并且 ma​​sterData 的值应该已复制到列表data。你是对的 !但是这个故事只有一点点转折!

基元的情况下,传递值,但在对象的情况下,对象引用按值传递

因此,您引用的是 ma​​sterData 的对象,而不是将值复制到新列表!

解决方案

this.data = FXCollections.observableArrayList(data);

这将为要引用的数据 创建一个新对象,所有操作都将在这个新对象的数据上完成。

关于java - 复制 ObservableList java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24441810/

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