При программировании я часто сталкиваюсь с проблемой обработки неизвестного числа объектов.Под обработкой я подразумеваю ссылки на них, манипулирование ими и т. Д. Что касается меня, это будет при разработке небольших игр и программ.
В настоящее время я работаю над программой ведения счетов, в которой должны отображаться имена игроков, их оценки, а также различные другие функции.Кроме того, должно быть две кнопки, которые позволяют добавлять и удалять игроков из таблицы результатов, на чем я остановлюсь здесь.Это может выглядеть примерно так:
//A very limited version of my program
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class Application extends JFrame implements ActionListener{
//Fields, variables and components
Container mainCont = getContentPane(); //Main container, the window itself
private JPanel buttonPanel;
private JPanel namePanel;
private JButton addPlayerButton;
private JButton removePlayerButton;
//...
//Many more components
public Application(){
//Basic window initiation
setTitle("Score Keeper");
this.setSize(650, 700);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainCont.setBackground(Color.BLACK);
this.setContentPane(mainCont);
buttonPanel = new JPanel();
namePanel = new JPanel();
addPlayerButton = new JButton();
addPlayerButton.addActionListener(this);
buttonPanel.add(addPlayerButton);
removePlayerButton = new JButton();
removePlayerButton.addActionListener(this);
buttonPanel.add(removePlayerButton);
this.add(buttonPanel);
this.add(namePanel);
this.setVisible(true);
//Other code omitted for now
//Includes other graphic components, layout managers etc.
}
/*
* Action-Listener.
* Performs an event on an action.
*/
@Override
public void actionPerformed(ActionEvent event){
if(event.getSource() == addPlayerButton){
Application.Player newPlayer = this.new Player(); //Creates a new object, i.e. a new player
//See below for Player class
}
if(event.getSource() == removePlayerButton){
//******
// This is where the problem lies
}
}
//I use a nested class to create a new player
public class Player{
//Components etc.
private String name;
private JLabel nameLabel;
public Player(){
name = getName();
nameLabel = new JLabel(name);
namePanel.add(nameLabel);
}
public String getName(){
//This basically gets input from the user to assign a name to the new player
//Code omitted for now
}
}
}
Пока все хорошо.Эта программа в основном имеет только две кнопки, где addPlayerButton добавляет объект проигрывателя, имя которого отображается на экране.Каждый раз, когда нажимается эта кнопка, новый игрок добавляется на экран.И это может быть сделано неограниченное количество раз.
Проблема возникает, когда мы хотим удалить игрока.Как мы можем сделать это?Мы не можем ссылаться на него по имени, так как все объекты игроков практически анонимны.
Альтернативой, конечно, было бы заранее определить фиксированное количество объектов игроков:
class Application extends JFrame implements ActionListener{
//Fields, variables and components
Container mainCont = getContentPane(); //Main container, the window itself
private JPanel buttonPanel;
private JPanel namePanel;
private JButton addPlayerButton;
private JButton removePlayerButton;
private Player player1;
private Player player2;
private Player player3;
//...
//Etc.
Тогда мы сможем обратиться непосредственно к каждому объекту игрока, но это просто слишком непрактично.Мы не можем добавить больше игроков, чем заранее определенное количество, и если мы хотим меньше игроков, у нас есть куча объектов игроков, которые никогда не используются.Кроме того, мы должны были бы жестко закодировать каждое посвящение каждого игрока - каждый nameLabel должен был бы быть вручную добавлен на экран и т. Д.
Пожалуйста, поделитесь своими знаниями о том, как вы решаете проблемы такого рода, как вы справляетесь с ними.неизвестное количество объектов.Спасибо, что нашли время и за помощь!
PS Я все еще довольно новичок в этом форуме.Пожалуйста, дайте мне знать, если есть что-то с этим вопросом, который я могу изменить, и т. Д. Я провел исследование и не нашел ни одного предыдущего вопроса, который бы занимался этим, но если есть один, который я пропустил, не стесняйтесь, дайте мне знать!
РЕДАКТИРОВАТЬ 1: Хорошо.Было много отличных ответов.Я выбрал тот, который использовал hashmaps как правильное решение, так как считаю, что это лучшее решение для предоставленных мною помещений.То, как я на самом деле решил свою проблему, это то, что я добавил к объекту player JButton, который удаляет объект проигрывателя, в котором он хранится. Я также отказался от концепции использования вложенного класса для проигрывателя и просто реализовал его в отдельном классе.,Однако в целом я узнал, что при работе с объектами, а количество объектов вы не знаете, как правило, лучше хранить их в какой-то коллекции.Я предпочитаю Hashmap, так как он обеспечивает простой способ доступа к объекту на основе одного из его свойств, например, имени String или аналогичного.