0

私はファンタジーフットボールドラフトプログラムを作成しようとしています。私が苦労している最初のステップは、データをリストに正しく読み込むことです。データを1行ずつスキャンしたい。各役割名を設定するループを作成し、「-----」が行に表示されるまで、その役割を持つすべての人を追加します。次に、その役割が役割のリストに追加されます。私のループはすべて正しいと思いますが、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);  
}

    
    

}

4

3 に答える 3

0

あなたのコードで私が見る

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

isInteger(personLine)true と評価された場合、これは無限ループになります。おそらく、while ではなく if である必要があるか、personLine反復ごとに変更する必要があります。

于 2013-02-12T02:35:01.193 に答える
0

2 つのコンストラクターがあります

公人 () {

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

あなたの質問を正しく理解できれば、ランク、名前、起源の値を設定するために、2 番目のコンストラクターを呼び出す必要があります。しかし、ここであなたのループで

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

ここで呼び出しnew Person()ています。他のコンストラクターを呼び出すように変更してみてください。

于 2013-02-12T02:52:46.093 に答える
0

setData と同じように、文字列を受け入れるコンストラクターを作成し、そのコンストラクターで setData メソッドを呼び出して、文字列を送信します。このようにして setData を保持し、コンストラクターは基本的に setData() です。

コンストラクターをそのまま維持したい場合は、メインの文字列を分割する必要があります

于 2013-02-12T04:58:51.520 に答える