Есть ли способ динамически удалять записи массива - PullRequest
1 голос
/ 08 марта 2019

Как вы можете видеть на изображении ниже, я хочу выбрать что-то из своей таблицы (что меняется всякий раз, когда я нажимаю кнопку из вертикального поля слева, т. Е. «Обзор», «Заказы» ...) и удаляю запись.из массива (т. е. откуда взято содержимое).

Метод, к которому я подошел ниже, работает, но он не изящен, поскольку мне нужно создать не более 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 Ответ

1 голос
/ 09 марта 2019

Этот псевдокод нуждается в рефакторинге, так как у меня нет всего кода, который вы используете, но я бы хотел, чтобы вы поняли общую идею

Хорошо, я считаю, что в коде нажатия кнопки вы должны сообщитьна вашем фиктивном сервере, список которого в данный момент используется, попробуйте добавить его на фиктивный сервер

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 - это интерфейс, поэтому, когда я назначил ингридиенты объект, этот интерфейс будет ссылаться на тот же ArrayList, что и объект, и будет воспринимать все его поведение (как искать объект ингредиента и т. Д.) Таким образом, когда мы будем использовать currentList во время выполнения после кнопкинажмите, мы уверены, что currentList будет таким же, как список, по которому щелкнули, и указывая на тот же список в памяти

Желаю это простои действительно возобновить объяснение может помочь вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...