猿问

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

我在编程时经常遇到的一个问题是如何处理未知数量的对象。处理我的意思是引用它们,操纵它们等等。至于我,这将是在开发较小的游戏和程序时。


目前我正在开发一个记分程序,它应该显示球员的姓名、他们的得分以及其他各种功能。此外,应该有两个按钮允许从计分表中添加和删除玩家,这是我在这里要关注的。它可能看起来像这样:


//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);


        }


    }


}

到目前为止一切都很好。这个程序基本上只有两个按钮,其中 addPlayerButton 添加了一个播放器对象,该对象的名称显示在屏幕上。每次按下此按钮时,都会在屏幕上添加一个新玩家。这可以无限次地完成。

当我们想要移除一个玩家时,问题就来了。我们怎样才能做到这一点?我们不能按名称引用它,因为所有玩家对象实际上都是匿名的。

然后我们就可以直接寻址每个玩家对象,但这太不切实际了。我们不能添加比预定义数量更多的玩家,如果我们想要更少的玩家,我们会有一堆从未使用过的玩家对象。此外,我们必须对每个玩家的每次启动进行硬编码 - 每个 nameLabel 都必须手动添加到屏幕等。


请分享您如何处理此类问题的知识,以及您如何处理未知数量的对象。感谢您抽出宝贵时间和帮助!


PS 我对这个论坛还是很陌生。请让我知道这个问题是否有任何我可以改变的地方等。我做了我的研究,没有发现以前的问题可以解决这个问题,但如果有我错过的问题,请随时告诉我!


编辑1:好的。有很多很棒的答案。我选择使用 hashmaps 作为正确的解决方案,因为我认为这是我提供的前提的最佳解决方案。我实际解决我的问题的方法是,我向播放器对象添加了一个 JButton,用于删除存储它的播放器对象。我还取消了为播放器使用嵌套类的概念,并在单独的类中实现它. 不过,我从总体上学到的是,在处理对象并且您不知道对象的数量时,通常最好将它们存储在某种集合中。我的偏好是 Hashmap,因为它提供了一种基于对象属性(如字符串名称或类似属性)访问对象的简单方法。


Smart猫小萌
浏览 170回答 3
3回答

扬帆大鱼

您可以使用 Map/Hashmap,每次创建玩家时,将它们添加到地图中。你还必须改变直接在屏幕上绘制玩家,可能是绘制地图中的所有玩家,这样当玩家从地图中移除时,它将不再被绘制。你会做这样的事情:&nbsp;&nbsp;&nbsp;&nbsp;Map<String,&nbsp;Player>&nbsp;map&nbsp;=&nbsp;new&nbsp;HashMap<>(); &nbsp;&nbsp;&nbsp;&nbsp;map.put(player.Name,&nbsp;player);然后您将在该哈希图中绘制所有内容。要移除,您只需要提供要移除的玩家的姓名。&nbsp;&nbsp;&nbsp;&nbsp;map.remove(player.Name);当然,然后您会稍微更改代码以呈现地图内的所有内容,我相信您需要一种方法来知道要删除哪个玩家,您可能想要添加一个文本字段来输入要删除的玩家的名称移除。

绝地无双

我会@Katada Freije 使用HashMap 的方法。稍微详细说明一下,您基本上有一个Players以他们的名字为键的集合。然后您使用密钥删除Player.但我也可能会避免这种情况,因为某些场景有多个Players同名。我会去List<Player>。这种方式Player将通过索引而不是名称来定义。然后,您将使用索引通过一些内置方法删除播放器。

小唯快跑啊

如果您想Player根据其名称删除 a,您可以执行以下操作:// Create a list of players, which you can define globallyArrayList<Player> players = new ArrayList<>();// The name of the player to findString name = "theNameOfThePlayerToFind";// Loop through the players and remove the player with the given namefor (Player player : players) {&nbsp; &nbsp; if (player.getName().equals(name)) {&nbsp; &nbsp; &nbsp; &nbsp; players.remove(player);&nbsp; &nbsp; }}您还可以轻松地将新玩家添加到列表中:players.add(new Player());
随时随地看视频慕课网APP

相关分类

Java
我要回答