1

私のプロジェクトでは、停止しない限り、ユーザーが1つのメソッドで必要な名前を入力するための配列リストがあります。次に、別のメソッドで、入力したばかりの値を再度呼び出す必要があるため、名前ごとにさらに情報を入力できます。

例:

  1. 名前を入力してください:
  2. 名前:ボブ
  3. 名前:ジョー
  4. name: これを停止すると、別のメソッドがトリガーされて詳細情報が表示されます:

  5. bob: 年齢を入力: 住所を入力:

  6. ジョー: 年齢を入力してください: 住所を入力してください:

    ただし、現在、arraylist は正しく出力されておらず、特定の名前が繰り返されていますが、他の名前は 2 番目の方法では表示されません。また、2 番目の方法のループは終了しません。入力した名前の情報を入力しますが、「name:」というプロンプトが表示され続け、実際の arraylist 値は表示されません。ループに問題があると思われますが、修正方法がよくわかりません。また、ラッパーを使用して配列リストに値を入れる方法に問題があるのではないかと思いましたが、それを修正する方法がわかりません。

2 番目の方法では、2 番目の方法で別のカウンターを使用して配列リスト内の順序を追跡するためにカウンター変数を交換しようとしましたが、違いはないようです。最初の方法では、前の 2 つのオプション if ループ内の for ループ カウンターである while (!input.equals("Stop")) を使用して、ループを別のブール型の while ループと交換しようとしました。および上記のいくつかの組み合わせ。

ここに私のコードがあります

Scanner console = new Scanner(System.in); private ArrayList<Directory> nameList; //i have to use object oriented programming to store values in the Directory Class public int i;

最初の方法:

private void addName() 
{
    Scanner LocalInput = new Scanner(System.in);
    Directory buffer = null;
    String ID = null;

    System.out.println("Enter Station Designations Below, Enter Stop to quit");
    boolean breaker = false;
    while(breaker ==false)
    {
        System.out.print("Name:  ");
        ID = (LocalInput.nextLine());
        if(ID.equals("Stop"))
            breaker = true;
        else
            buffer = new Directory(ID); 
            nameList.add(buffer); 
    }
}

2番目の方法:

private void getInfo()
{
    Scanner LocalInput = new Scanner(System.in);

    Directory buffer;
    buffer = nameList.get(i); 
    double age; String address;


    System.out.println("Enter Temperatures below...");
    System.out.println("" + nameList.get(i));

    for (i = 0; i < nameList.size(); i++) 
    {

        System.out.println("Name: " + buffer.GetID()); //there's a getter and setter in the Directory class
        System.out.println( "Age:\t");
        age = LocalInput.nextDouble();
        System.out.print( "Address:\t");   
        address = LocalInput.nextLine();
        buffer= new Directory(age, address);
        nameList.add(buffer);
    }
}
4

3 に答える 3

2

最初の方法に対する批判

まだよく見ていませんが、これが問題であると強く疑っています。

if(ID.equals("Stop"))
    breaker = true;
else
    buffer = new Directory(ID); 
    nameList.add(buffer); 

ID が "Stop" に等しくない場合にのみ最後のステートメントが実行されることを期待しているように見えますが、実際には常に実行されます。(たとえば) Python とは異なり、空白は Java では無関係です。ステートメントをブロックと見なす場合は、中かっこが必要です。

if(ID.equals("Stop"))
    breaker = true;
else {
    buffer = new Directory(ID); 
    nameList.add(buffer); 
}

個人的には、両方の部分を中括弧で囲みます。

if (ID.equals("Stop")) {
    breaker = true;
} else {
    buffer = new Directory(ID); 
    nameList.add(buffer); 
}

buffer...そして、おそらく無関係な変数を取り除く可能性があります:

if (ID.equals("Stop")) {
    breaker = true;
} else {
    nameList.add(new Directory(ID));
}

また、変数を取り除きbreaker、スコープを制限します(ID通常の規則に準拠するために名前も変更します)。結果は次のようになります。

while (true) {
    System.out.print("Name:  ");
    string id = LocalInput.nextLine();
    if (id.equals("Stop")) {
        break;
    }
    nameList.add(new Directory(ID));
}

第二の方法に対する批判

これは現時点では本当に奇妙です。i変数がどこで宣言されているのか、bufferなぜ一度だけフェッチするのか、既存のオブジェクトを変更するのではなく、既存のリストに追加するだけなのか、まったく明確ではありません。私はあなたが本当に欲しいと思う:

for (Directory entry : nameList) {
    System.out.println("Name: " + entry.GetID());
    System.out.println( "Age:\t");
    double age = LocalInput.nextDouble();
    entry.setAge(age);
    System.out.print( "Address:\t");   
    String address = LocalInput.nextLine();
    entry.setAddress(address);
}

i現在のループは常に等しくなるまで続行されることに注意してください。ただし、ループ内のサイズnameList.size()は常に増加しているため、終了することはありません。

于 2012-07-11T08:35:54.940 に答える
1
private void getInfo()
{
    Scanner LocalInput = new Scanner(System.in);
    double age; String address;

    for (Directory name : nameList) {
    System.out.println("Name: " + name .GetID());
    System.out.println( "Age:\t");
    double age = LocalInput.nextDouble();
    name.setAge(age);
    System.out.print( "Address:\t");   
    String address = LocalInput.nextLine();
    name.setAddress(address);
}
}

getメソッドは次のようになります

および追加は-である必要があります

private void addName() 
{
    Scanner LocalInput = new Scanner(System.in);
    Directory buffer = null;
    String ID = null;

    System.out.println("Enter Station Designations Below, Enter Stop to quit");
    boolean breaker = false;
    while(breaker ==false)
    {
        System.out.print("Name:  ");
        ID = (LocalInput.nextLine());
        if(ID.equals("Stop"))
            breaker = true;
        else {
            buffer = new Directory(ID); 
            nameList.add(buffer); 
        }
    }
}
于 2012-07-11T08:45:09.443 に答える
0

キーワードの使用を検討してください。そうすれば、フラグとブランチbreakは必要ありません。breakerelse

while(true)
{
    System.out.print("Name:  ");
    ID = (LocalInput.nextLine());
    if(ID.equals("Stop"))
        break;

    buffer = new Directory(ID); 
    nameList.add(buffer); 
}

申し訳ありませんがすでに投稿されました...

于 2012-07-11T08:39:38.730 に答える