有没有办法动态删除arraylist的条目

时间:2019-03-08 19:59:47

标签: java javafx

从下图可以看到,我想从表中选择某项(每当我按下垂直框左侧的按钮即“概述”,“订单” ...时,它都会更改)并删除记录来自数组(即内容的来源)。

我采用的方法很有效,但是它并不优雅,因为我必须为每个按钮id创建最多8个if语句。有什么办法可以动态删除内容。 JVM是否有办法找出哪个记录​​属于哪个数组列表?

enter image description here

  

TableController

@FXML
private TableView<Object> defaultTableView;

public void delete(){

if( MockServer.getServer().currentButton.equals("btnIngredients"))
    MockServer.getServer().removeIngredient(defaultTableView.getSelectionModel().getSelectedItem());
else if ( MockServer.------.equals("btnOrders"))
MockServer.getServer().removeOrder(defaultTableView.getSelectionModel().getSelectedItem());
}
  

控制器

@FXML
private TableController tableController;

@FXML
public void deleteRecord(ActionEvent event){
    tableController.delete();
}
  

MockServer

public class MockServer implements ServerInterface {

 public Restaurant restaurant;
 public ArrayList<Dish> dishes = new ArrayList<Dish>();
 public ArrayList<Drone> drones = new ArrayList<Drone>();
 public ArrayList<Ingredient> ingredients = new ArrayList<Ingredient>();
 public ArrayList<Order> orders = new ArrayList<Order>();
 public ArrayList<Staff> staff = new ArrayList<Staff>();

 public MockServer(){}

 public ArrayList<Ingredient> getIngredients() { return this.ingredients; }
 public ArrayList<Order> getOrders() { return this.orders; }
 public ArrayList<Staff> getStaff() { return this.staff; }
 ....

 static public ServerInterface getServer(){
    return server;
 }

 @Override
 public void removeIngredient(Ingredient ingredient) {
    int index = this.ingredients.indexOf(ingredient);
    this.ingredients.remove(index);
    this.notifyUpdate();
 }

}

1 个答案:

答案 0 :(得分:1)

此伪代码将需要重构,因为我没有您正在使用的所有代码,但我希望您能有所了解

好吧,我相信在按钮单击代码中,您必须告诉模拟服务器当前正在使用的列表,请尝试将其添加到模拟服务器中

List currentList = null;

public void setCurrentList(String listName) { // you can use integer but the best is to use enum type setCurrentList(enum) this way you will get tapeSafety
     switch(listName){
        case "ingredients" : currentList = ingredients ; break;
        //other cases 
        default : throw new Exception(" list not referred error with key value"+listName);
     }
}

public void delete(Object o){
     int index = this.currentList.indexOf(o);
     this.currentList.remove(index);
}

现在您可以像下面那样更新控制器删除

public void delete(){
MockServer.getServer().delete(defaultTableView.getSelectionModel().getSelectedItem());  
}

为什么这应该起作用?

您必须知道,有一种好的做法是向接口而不是实现说明代码

您知道Java中的 List 是一个接口,因此当我分配成分对象时,该接口将引用与该对象相同的ArrayList并采取所有行为(如何搜索成分对象等),当我们在单击按钮后在运行时使用currentList时,可以确保currentList与单击的列表相同,并指向内存中的同一列表

希望这个简单且真正的简历说明可以为您提供帮助