【问题标题】:How do I add an instance of a class without the constructor's parameters?如何在没有构造函数参数的情况下添加类的实例?
【发布时间】:2013-01-27 06:42:55
【问题描述】:

我正在尝试创建一个梦幻足球选秀计划。我遇到困难的第一步是正确地将数据读入列表。我想逐行扫描数据。我创建了一个循环来设置每个角色名称,然后继续添加所有具有该角色的人,直到“-----”出现在一行上。然后将该角色添加到角色列表中。我相信我的循环是正确的,但是,我不知道如何正确使用我的 Person 构造函数,以便它包含我无法使用 Person 类中的 setData 方法实现的等级、名称和来源。我仍然是编程的初学者,我想知道我是否遗漏了什么。

数据文件

领导

1 超人 DC

2 美国队长惊奇

3 教授 X 奇迹

4 铲子神秘人

粗壮

1 绿巨人奇迹

2 金刚狼漫威

3 奇迹

4 野兽奇迹

5 雷神奇迹

6 愤怒的神秘人先生

7 不可思议的皮克斯先生

...等等

主类

import java.util.HashMap;
import java.util.List;
import java.util.Scanner; 
import java.io.*; 
import java.util.ArrayList;

public class FantasyTeamDraft {

/**
 * Joseph Simmons
 * CPS 181
 * February 6, 2013
 */
public static void main(String[] args) throws IOException{
    Scanner scan = new Scanner (System.in);
    
    System.out.println("Enter the name and location of the file wanted for the draft: "); 
    File draftData = new File (scan.next());
    Scanner scanData = new Scanner(draftData); 
    
    List <Role> listOfRoles = new ArrayList <Role> (); 
    while (scanData.hasNext()) {
        String line = scanData.nextLine(); 
        if (!isInteger (line)) {
            Role role = new Role (); 
            role.setRoleName(line); 
            String personLine = scanData.nextLine(); 
            while (isInteger(personLine)){
                Person person = new Person(); 
                person.setData(personLine);
                role.addPerson(person); 
            }
            listOfRoles.add(role); 
    } 
        }
     
    
    
    
    
}

public static boolean isInteger (String line) {
    try {
        Integer.parseInt(line.split("\t") [0]); 
    } catch (NumberFormatException e) {
        return false; 
    }
    return true; 
}

}

人物类

import java.util.Scanner;

public class Person {

private int rank; 
private String name; 
private String origin;

public Person () {
    
}
public Person (int rank, String name, String origin) {
    this.rank = rank; 
    this.name = name; 
    this.origin = origin; 
}

public void setData (String line) {
    String [] array = line.split("\t"); 
    this.rank = Integer.parseInt(array [0]); 
    this.name = array [1]; 
    this.origin = array [2]; 
}

}

角色类

    import java.util.List;
import java.util.Scanner;

public class Role {

private String roleName = ""; 
private List <Person> listOfPeople;

public Role (String roleName) {
    this.roleName = roleName;  
}

public void setRoleName (String line) {
    this.roleName = line; 
}

public String getRoleName() {
    return roleName; 
}

public void addPerson (Person person) {
    this.listOfPeople.add(person);  
}

    
    

}

【问题讨论】:

  • 您是否遇到任何具体错误?

标签: java constructor instance-variables


【解决方案1】:

在你的代码中我看到了

 while (isInteger(personLine)){
            Person person = new Person(); 
            person.setData(personLine);
            role.addPerson(person); 
        }

如果isInteger(personLine) 计算结果为真,这将是无限循环。也许应该是 if 而不是 while,或者您需要在每次迭代中修改 personLine

【讨论】:

    【解决方案2】:

    你有两个构造函数

    公众人物 () {

    public Person (int rank, String name, String origin) {
    this.rank = rank; 
    this.name = name; 
    this.origin = origin; 
    }
    

    如果我正确理解您的问题,为了设置等级、名称和来源的值,您可能需要调用第二个构造函数。但在你的循环中

    while (isInteger(personLine)){
                Person person = new Person(); 
                person.setData(personLine);
                role.addPerson(person); 
            }
    

    您在此处调用new Person(),尝试更改它以调用另一个构造函数。

    【讨论】:

    • 我知道我需要这样做,但在使用方法 .setData 之前我无法获得“int rank、String name 和 String origin”。我该如何处理 htis?
    • 一旦你调用了默认构造函数,所有的值都会被赋给一个默认值,并且由于在你在构造函数之后调用 setData 的代码中,它正在调用 setData 方法。
    • 那我调用setData方法后怎么办?
    【解决方案3】:

    创建一个接受字符串的构造函数,就像 setData 一样,然后在该构造函数中调用您的 setData 方法,将字符串发送给它。这样您就可以保留 setData,而您的构造函数基本上是 setData()。

    如果你想让构造函数保持原样,你必须在 main 中拆分字符串

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-16
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      相关资源
      最近更新 更多