简体   繁体   English

JAVA-问题打印ArrayList

[英]JAVA - Issues Printing ArrayList

I'm currently attempting to make a lottery program through the use of a GUI. 我目前正在尝试通过使用GUI制作彩票程序。 I can not figure out why the method getTicketNumbers() is not returning anything. 我不知道为什么方法getTicketNumbers()不返回任何东西。 It is simply printing []. 它只是打印[]。

And so too is: 因此:

String output = "Name: " + name + "\nNumbers: " + ticketNumbers + "\n\n";

tickNumbers is outputting [] but name successfully prints out the name. tickNumbers输出[],但name成功打印出了名字。

I added a System.out.print to the Ticket class in the constructor to confirm the ArrayList is being passed successfully and it is: 我在构造函数的Ticket类中添加了System.out.print,以确认ArrayList已成功传递,它是:

public Ticket(ArrayList<Integer> ticketNumbers, String name) {
    this.ticketNumbers = ticketNumbers;
    this.name = name;
    System.out.print("Are the numbers being passed:" + ticketNumbers + "\n");
}

The method toString is successfully printing the name but again, it is not printing the ArrayList called ticketNumbers. 方法toString成功地打印了名称,但是再次,它没有打印称为票证号码的ArrayList。

private void enterLottoButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                 
    if (nameInput.getText().equalsIgnoreCase("")) {
        JOptionPane.showMessageDialog(null, "Please Enter Your Name", "Error", JOptionPane.ERROR_MESSAGE);
    } else if (ticketNumbers.size() < 4) {
        JOptionPane.showMessageDialog(null, "Please Enter Four Numbers", "Error", JOptionPane.ERROR_MESSAGE);
    } else {
        ticketList.add(new Ticket(ticketNumbers, nameInput.getText()));

        JOptionPane.showMessageDialog(null, "You Successfully Entered! \n\nName: " + nameInput.getText() + "\nNumbers: " + ticketNumbers.toString());

        ticketNumbers.clear();
        numbersTextField.setText("");
        nameInput.setText("");     
        numberOfPeopleLabel.setText("           People Entered: " + ticketList.size());
    }

Ticket Class: 机票类别:

import java.util.ArrayList;
import java.util.Collections;
import javax.swing.JOptionPane;

public class Ticket {
    private String name;
    private ArrayList<Integer> ticketNumbers = new ArrayList<>();

public Ticket(ArrayList<Integer> ticketNumbers, String name) {
    this.ticketNumbers = ticketNumbers;
    this.name = name;
    System.out.print("Are the numbers being passed:" + ticketNumbers + "\n");
}

public String getName() {
    return name;
}

public ArrayList<Integer> getTicketNumbers() {
    return ticketNumbers;
}

public ArrayList<Integer> getSortedTicketNumbers() {
    Collections.sort(ticketNumbers);
    return ticketNumbers;
}

@Override
public String toString() {
    String output = "Name: " + name + "\nNumbers: " + ticketNumbers + "\n\n";

    return output;
}
}

If needed, code in its entirety: http://pastebin.com/7i8VWQLk and http://pastebin.com/iRd49Nc7 如果需要,请完整编码: http : //pastebin.com/7i8VWQLkhttp://pastebin.com/iRd49Nc7

It looks like you're copying the reference to the list, and so when you clear it in one place (or modify it) it changes/clears everywhere. 似乎您正在将引用复制到列表,因此当您在一个位置清除(或修改)引用时,它会在所有地方更改/清除。

Try making a defensive copy. 尝试制作防御性副本。 Like: 喜欢:

ArrayList<Integer> tickets = new ArrayList<>(ticketNumbers)

ticketNumbers.clear()

This line cause the problem. 这条线导致问题。 As you said, during the construction of Ticket object, the data been passed in correctly in this line: ticketList.add(new Ticket(ticketNumbers, nameInput.getText())); 如您所说,在构造Ticket对象的过程中,数据已在此行中正确传递: ticketList.add(new Ticket(ticketNumbers, nameInput.getText())); . But you cleared them afterwards. 但是您之后清除了它们。 You will need a clone of ticketList . 您将需要ticketList Regardless of the best practice, you can do it inside Ticket class. 无论采用哪种最佳做法,都可以在Ticket类内进行。

private List<Integer> clonedTicketNumbersList = new ArrayList<Integer>();

public Ticket(ArrayList<Integer> ticketNumbers, String name) {
    this.ticketNumbers = ticketNumbers;
    this.name = name;
    for(Integer ticketNum : ticketNumbers) {
      clonedTicketNumbersList.add(ticketNum );
    }
    System.out.print("Are the numbers being passed:" + ticketNumbers + "\n");
}

@Override
public String toString() {
    String output = "Name: " + name + "\nNumbers: " + clonedTicketNumbersList + "\n\n";

    return output;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM