【问题标题】:Printing elements from a for loop从 for 循环打印元素
【发布时间】:2015-12-22 00:03:48
【问题描述】:

我有一个非常奇怪的问题,我有一个方法 noOfPlayers 询问游戏中的玩家数量,一旦我知道游戏中的玩家数量,我会依次询问他们的名字。一旦我得到了玩家的名字,就会创建一个框架,要求他们指定他们想要选择的计数器。当他们单击紫色宝石(出于测试目的)时,它应该在控制台中打印出玩家姓名,但 for 循环似乎不起作用。知道如何让循环正常工作吗?

public class setupPlayers extends JFrame implements ActionListener {
    int intOfPlayers, purpleClick = 0, orangeClick = 0, iceClick = 0, greenClick = 0;
    ArrayList<Player> arrayOfPlayers = new ArrayList<Player>();
    JButton purpleGemBTN, greenGemBTN, iceCubeBTN, orangeGemBTN;
    JFrame organisationPanel;
    JPanel titleChoiceCounter, counterSelector;
    ImageIcon finalCounter;
    private static Dialog d;

    public setupPlayers() {}

    public void noOfPlayers() {
        try {
            String inputValue = JOptionPane.showInputDialog("Please input the number of players");
            intOfPlayers = Integer.parseInt(inputValue);
            if (intOfPlayers > 4) {
                JOptionPane.showMessageDialog(null, "Only 1-4 can play!", "Error!", JOptionPane.ERROR_MESSAGE);
                noOfPlayers();
                intOfPlayers = 0;
            }

            for (int z = 0; z < intOfPlayers; z++) {
                String playerName = JOptionPane.showInputDialog("Player " + (z + 1) + " please input your name");
                chooseCounter();
                arrayOfPlayers.add(new Player(playerName, (z + 1), null, 0));
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "You did not enter the number of players, please enter the number of players", "Error!", JOptionPane.ERROR_MESSAGE);
            noOfPlayers();
        }
    }

    public void chooseCounter() {
        Frame window = new Frame();

        ImageIcon purpleGemImg = new ImageIcon("C:\\Users\\Anonymous\\Documents\\pink.png");
        ImageIcon greenGemImg = new ImageIcon("C:\\Users\\Anonymous\\Documents\\yellow.png");
        ImageIcon orangeGemImg = new ImageIcon("C:\\Users\\Anonymous\\Documents\\brown.png");
        ImageIcon iceCubeImg = new ImageIcon("C:\\Users\\Anonymous\\Documents\\white.png");

        d = new Dialog(window, "Please select your counter", true);
        d.setLayout(new GridLayout(2, 2));
        d.setLocation(400, 300);
        d.setSize(500, 500);

        purpleGemBTN = new JButton("purple", purpleGemImg);
        greenGemBTN = new JButton(greenGemImg);
        orangeGemBTN = new JButton(orangeGemImg);
        iceCubeBTN = new JButton(iceCubeImg);

        purpleGemBTN.addActionListener(this);
        greenGemBTN.addActionListener(this);
        iceCubeBTN.addActionListener(this);
        orangeGemBTN.addActionListener(this);

        d.add(purpleGemBTN);
        d.add(greenGemBTN);
        d.add(orangeGemBTN);
        d.add(iceCubeBTN);

        d.setVisible(true);
    }

    public static void main(String[] args) {
        setupPlayers spObj = new setupPlayers();
    }

    public void actionPerformed(ActionEvent e) {
        JButton pressed = new JButton();
        pressed = (JButton) e.getSource();
        if (pressed.getText().equals("purple")) {
            for (int z = 0; z < arrayOfPlayers.size() - 1; z = z) {
                String currentPlayer = arrayOfPlayers.get(z).playerNme;
                System.out.println(currentPlayer);
            }
            d.setVisible(false);
        }
    }
}

【问题讨论】:

  • 未来参考:当你说“它似乎不起作用”时,解释应该发生什么以及会发生什么。
  • 我刚刚注意到你在递归调用noOfPlayers(); 我想你会得到一些意想不到的结果。
  • 我该如何解决这个问题,如果他们在玩家人数中输入了无效字符串,则继续询问玩家人数?这是我能想到的唯一方法。这就是 for 循环不起作用的原因吗?
  • 我会使用 do-while 循环。也许你递归正确,我不知道,我没有运行代码。
  • 一个 do while 循环不起作用只是测试了它。一旦我输入了玩家人数和他们所有的名字,它会再次询问玩家人数并且仍然无法正确打印

标签: java swing loops for-loop


【解决方案1】:

每个循环都更好

    for(Player p : arrayOfPlayers)
    {
      String name = p.playerNme;
      System.out.println(name);
    }

【讨论】:

  • 所以我添加了你的代码来代替我的代码,现在如果我在输入中写了要和 4 人一起玩,输入名字并在框架弹出时单击紫色宝石,然后输入第二个当输入弹出并再次单击紫色宝石时的名称...做同样的事情直到我写了所有 4 个玩家我在命令行输出中得到了这个错误 PlayerOne PlayerOne PlayerTwo PlayerOne PlayerTwo PlayerThree
【解决方案2】:

尝试编写这个for循环:

  for (int z=0; z<arrayOfPlayers.size()-1;z=z){...

像这样:

   for (int z=0; z<arrayOfPlayers.size();z++){...

增加z++ 并从arrayOfPlayers.size()-1 中删除-1,因为索引z0 开始:

【讨论】:

  • 我认为这里不需要从 size() 中减去 1
  • 当我尝试这种方法时,我得到了 PlayerOne PlayerOne PlayerTwo PlayerOne PlayerTwo PlayerThree
  • @Blueaddiction 你的意思是这个方法吗:actionPerformed
  • @abdhak 我用你的 for 循环替换了我在操作中执行的 for 循环,但它不能正确打印
【解决方案3】:

因此,根据您对先前答案的 cmets,我猜您的问题与您如何递归获取名称更相关。

这是一对快速的方法,似乎无需递归即可实现您想要的。

private ArrayList<Player> arrayOfPlayers = new ArrayList<>();
private int intOfPlayers;

public void noOfPlayers() {

    while (true) {
        String inputValue = JOptionPane.showInputDialog("Please input the number of players");

        if (inputValue != null) { // Text was entered, cancel not clicked
            try {
                intOfPlayers = Integer.parseInt(inputValue);
                if (intOfPlayers > 4 || intOfPlayers < 1) {
                    JOptionPane.showMessageDialog(null, "Only 1-4 can play!", "Error!", JOptionPane.ERROR_MESSAGE);
                } else {
                    break; // stop asking for numbers
                }
            } catch (NumberFormatException e) {
                JOptionPane.showMessageDialog(null, "Please enter a number!", "Error!", JOptionPane.ERROR_MESSAGE);
                e.printStackTrace(); // never ignore errors, even if obvious
            }
        } else {
            System.out.println("Quitting from number players input");
            System.exit(0); // Canceled the dialog, so quit the program
        }

    }

    for (int z = 0; z < intOfPlayers; z++) {
        String playerName = JOptionPane.showInputDialog("Player " + (z + 1) + " please input your name");
        if (playerName != null) {
            // chooseCounter(playerName);
            arrayOfPlayers.add(new Player(playerName, (z + 1), null, 0));
        } else {
            System.out.println("Quitting from player " + (z + 1) + " name input");
            System.exit(0); // Canceled the dialog, so quit the program
        }
    }

    printPlayerNames();
}

private void printPlayerNames() {
    for (int z = 0; z < arrayOfPlayers.size(); z++) {
        String currentPlayer = arrayOfPlayers.get(z).playerNme;
        System.out.println(currentPlayer);
    }
}

【讨论】:

  • 早上实现这段代码,有错误反馈!谢谢
  • 嘿,我真的很欣赏代码工作的反馈,是否可以删除以删除除 for 循环修复之外的所有内容?我不想被指责抄袭。你也能解释一下当我使用递归时会发生什么,为什么它会以它的方式打印
  • 递归行为不正确的原因是,当你再次调用该函数时,它会正确返回到顶部,但是当函数退出时,它会在你最初调用的地方恢复行函数,因此将重复的名称添加到列表中。因此,欢迎您获取代码,但如果您担心抄袭,请更改它。不过,实际上并没有太多要改变的地方,因为我所做的只是取你的变量名并重新组织它们。
  • 我会使用boolean 值作为&lt;color&gt;Taken,然后说if (!&lt;color&gt;Taken) { &lt;color&gt;Taken = true; }。此外,您只需要使用takenCounter++; 而不是takenCounter = takenCounter++;,因为takenCounter++; 扩展为takenCounter = takenCounter + 1;
  • 同时停止让触发器对您的方法调用感到满意。您正在从 ActionListener 调用 chooseCounter,如果您这样做,您将创建一个带有一组新按钮的全新框架。 actionListener 的目的是执行一个动作(设置玩家的头像),而不是重启你的应用。
【解决方案4】:

您没有遍历 for 循环 z++ 而不是 z=z

for (int z=0; z<arrayOfPlayers.size()-1;z++){
    String currentPlayer = arrayOfPlayers.get(z).playerNme;
    System.out.println(currentPlayer);

【讨论】:

    【解决方案5】:

    当您拥有for (int z=0; z&lt;arrayOfPlayers.size()-1;z=z) 时,您将无限迭代,因为z 将始终等于0

    尝试将z=z 更改为z++,以便迭代结束一次z = arrayOfPlayers.size()-1

    您的代码将是:

    for (int z=0; z<arrayOfPlayers.size();z++){
        String currentPlayer = arrayOfPlayers.get(z).playerNme;
        System.out.println(currentPlayer);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-05
      • 2015-11-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多