为了账号安全,请及时绑定邮箱和手机立即绑定

在 Java 中处理未知数量的对象

在 Java 中处理未知数量的对象

Smart猫小萌 2021-11-24 18:46:40
我在编程时经常遇到的一个问题是如何处理未知数量的对象。处理我的意思是引用它们,操纵它们等等。至于我,这将是在开发较小的游戏和程序时。目前我正在开发一个记分程序,它应该显示球员的姓名、他们的得分以及其他各种功能。此外,应该有两个按钮允许从计分表中添加和删除玩家,这是我在这里要关注的。它可能看起来像这样://A very limited version of my programimport 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);        }    }}到目前为止一切都很好。这个程序基本上只有两个按钮,其中 addPlayerButton 添加了一个播放器对象,该对象的名称显示在屏幕上。每次按下此按钮时,都会在屏幕上添加一个新玩家。这可以无限次地完成。当我们想要移除一个玩家时,问题就来了。我们怎样才能做到这一点?我们不能按名称引用它,因为所有玩家对象实际上都是匿名的。然后我们就可以直接寻址每个玩家对象,但这太不切实际了。我们不能添加比预定义数量更多的玩家,如果我们想要更少的玩家,我们会有一堆从未使用过的玩家对象。此外,我们必须对每个玩家的每次启动进行硬编码 - 每个 nameLabel 都必须手动添加到屏幕等。请分享您如何处理此类问题的知识,以及您如何处理未知数量的对象。感谢您抽出宝贵时间和帮助!PS 我对这个论坛还是很陌生。请让我知道这个问题是否有任何我可以改变的地方等。我做了我的研究,没有发现以前的问题可以解决这个问题,但如果有我错过的问题,请随时告诉我!编辑1:好的。有很多很棒的答案。我选择使用 hashmaps 作为正确的解决方案,因为我认为这是我提供的前提的最佳解决方案。我实际解决我的问题的方法是,我向播放器对象添加了一个 JButton,用于删除存储它的播放器对象。我还取消了为播放器使用嵌套类的概念,并在单独的类中实现它. 不过,我从总体上学到的是,在处理对象并且您不知道对象的数量时,通常最好将它们存储在某种集合中。我的偏好是 Hashmap,因为它提供了一种基于对象属性(如字符串名称或类似属性)访问对象的简单方法。
查看完整描述

3 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

您可以使用 Map/Hashmap,每次创建玩家时,将它们添加到地图中。

你还必须改变直接在屏幕上绘制玩家,可能是绘制地图中的所有玩家,这样当玩家从地图中移除时,它将不再被绘制。

你会做这样的事情:

    Map<String, Player> map = new HashMap<>();
    map.put(player.Name, player);

然后您将在该哈希图中绘制所有内容。要移除,您只需要提供要移除的玩家的姓名。

    map.remove(player.Name);

当然,然后您会稍微更改代码以呈现地图内的所有内容,我相信您需要一种方法来知道要删除哪个玩家,您可能想要添加一个文本字段来输入要删除的玩家的名称移除。


查看完整回答
反对 回复 2021-11-24
?
绝地无双

TA贡献1946条经验 获得超4个赞

我会@Katada Freije 使用HashMap 的方法。稍微详细说明一下,您基本上有一个Players以他们的名字为键的集合。然后您使用密钥删除Player.

但我也可能会避免这种情况,因为某些场景有多个Players同名。我会去List<Player>。这种方式Player将通过索引而不是名称来定义。然后,您将使用索引通过一些内置方法删除播放器。


查看完整回答
反对 回复 2021-11-24
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

如果您想Player根据其名称删除 a,您可以执行以下操作:


// Create a list of players, which you can define globally

ArrayList<Player> players = new ArrayList<>();


// The name of the player to find

String name = "theNameOfThePlayerToFind";


// Loop through the players and remove the player with the given name

for (Player player : players) {

    if (player.getName().equals(name)) {

        players.remove(player);

    }

}

您还可以轻松地将新玩家添加到列表中:


players.add(new Player());


查看完整回答
反对 回复 2021-11-24
  • 3 回答
  • 0 关注
  • 162 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信