JAVA-发布打印ArrayList

JAVA-发布打印ArrayList,java,Java,我目前正试图通过使用GUI制作一个彩票程序。我不明白为什么getTicketNumbers()方法不返回任何内容。它只是简单地打印[] 此外,还有: String output = "Name: " + name + "\nNumbers: " + ticketNumbers + "\n\n"; tickNumbers正在输出[],但name已成功打印出名称 我在构造函数中的Ticket类中添加了System.out.print,以确认ArrayList正在成功通过,它是: public Ti

我目前正试图通过使用GUI制作一个彩票程序。我不明白为什么getTicketNumbers()方法不返回任何内容。它只是简单地打印[]

此外,还有:

String output = "Name: " + name + "\nNumbers: " + ticketNumbers + "\n\n";
tickNumbers正在输出[],但name已成功打印出名称

我在构造函数中的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");
}
公共票证(ArrayList票证编号、字符串名称){
this.ticketNumbers=ticketNumbers;
this.name=名称;
System.out.print(“正在传递的数字:“+TicketNumber+”\n”);
}
toString方法正在成功打印名称,但同样,它没有打印名为ticketNumber的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());
    }
private void enterLottoButtonActionPerformed(java.awt.event.ActionEvent evt){
if(nameInput.getText().equalsIgnoreCase(“”){
JOptionPane.showMessageDialog(null,“请输入您的姓名”,“错误”,JOptionPane.Error\u消息);
}else if(ticketNumbers.size()<4){
JOptionPane.showMessageDialog(null,“请输入四个数字”,“错误”,JOptionPane.Error\u消息);
}否则{
add(新票证(ticketNumber,nameInput.getText());
JOptionPane.showMessageDialog(null,“您已成功输入!\n\n名称:“+nameInput.getText()+”\n编号:“+TicketNumber.toString());
ticketNumbers.clear();
NumberTextField.setText(“”);
nameInput.setText(“”);
numberOfPeopleLabel.setText(“人员输入:+ticketList.size());
}
机票等级:

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;
}
}
import java.util.ArrayList;
导入java.util.Collections;
导入javax.swing.JOptionPane;
公务舱票{
私有字符串名称;
private ArrayList ticketNumbers=new ArrayList();
公共票证(ArrayList票证编号、字符串名称){
this.ticketNumbers=ticketNumbers;
this.name=名称;
System.out.print(“正在传递的数字:“+TicketNumber+”\n”);
}
公共字符串getName(){
返回名称;
}
公共数组列表getTicketNumbers(){
返回票号;
}
公共阵列列表GetSortedTicketNumber(){
集合。排序(票号);
返回票号;
}
@凌驾
公共字符串toString(){
字符串输出=“名称:”+Name+“\n数字:”+ticketNumbers+“\n\n”;
返回输出;
}
}
如果需要,完整的代码:
而且

看起来您正在将引用复制到列表中,因此,当您在一个位置清除(或修改)它时,它会到处更改/清除

试着做一个防御性的拷贝。比如:

ArrayList票证=新的ArrayList(票证编号)

这一行导致了问题。正如您所说,在构建
Ticket
对象的过程中,数据已在这一行中正确传递:
ticketList.add(new Ticket(ticketNumbers,nameInput.getText());
。但是您随后清除了它们。您需要克隆
票证列表
。无论最佳做法是什么,您都可以在
票证
类中执行

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;
}
private List clonedTicketNumbersList=new ArrayList();
公共票证(ArrayList票证编号、字符串名称){
this.ticketNumbers=ticketNumbers;
this.name=名称;
for(整数票证号:票证号){
clonedTicketNumbersList.add(ticketNum);
}
System.out.print(“正在传递的数字:“+TicketNumber+”\n”);
}
@凌驾
公共字符串toString(){
字符串输出=“名称:”+Name+“\n数字:”+ClonedTicketNumber列表+“\n\n”;
返回输出;
}

如果您能为这个程序添加一个驱动程序并向我们展示示例输出,那将非常有用。但是我注意到
ticketNumbers.clear()上面有一行;
这使我怀疑您在某个时候删除了票证号码。因为票证号码是空的。您在哪里向该列表添加了内容?我正在创建类的实例:ticketList.add(新票证(ticketNumbers,nameInput.getText());然后,我正在清除GUI类中的数组,以允许其他用户为彩票选择另一组数字。您将在何处创建克隆?@aontaigh查看我的更新答案,在循环之前声明它。这是完整的代码:-您将这段代码确切地放在何处?顺便说一句,我感谢您的帮助!我真的很抱歉衷心感谢您的帮助,非常感谢!很高兴帮助:)
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;
}