-1

ユーザーに7つの製品名を入力するように求めるプログラムを書いています。

私がやろうとしているのは、重複がある場合は、その方法を繰り返すことです。

while ループを使用しましたが、スタックしました。

最初にa、b、c、d、e、f、gを入力すると、メソッドが終了して次のメソッドに進みます。

しかし、a、a、b、c、d、e、fと入力すると、プログラムは同じメソッドを繰り返し、a、b、c、d、e、f、gと入力しても無限ループに入ります。

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

主に……

    purchasedList.setShopList();

purchaseList クラスで...

    public void setShopList() {
    Scanner keyboard = new Scanner(System.in);

    // print out description.
    System.out.println("\n- Only have one entry of any type in the item list.");
    System.out.println("- The name of items cannot be longer than 16 characters.");

    System.out.println("\nType seven products.");
    boolean sameNames = true;
    while (sameNames == true) {
        for (int i=0; i<7; i++) {
            String n = keyboard.nextLine();
            name.add(n);
            name.set(i,name.get(i).toUpperCase());
        }
        sameNames = checkName();
    }
}
// accessor.
public ArrayList<String> getShopList () {
    return name;
}
// check duplicate.
public boolean checkName() {

    Set<String> uniqueName = new HashSet<String>();

    boolean foundName = false;

    for (int i=0; i<7; i++) {
        if (!uniqueName.add(name.get(i))) { // check duplicate
            foundName = true;
        }
    }
    if (foundName == true) {
        System.out.println("※ There is a duplicate.  Try it again.");
        return true;
    } else {
        return false;
    }
}

私のcheckName()メソッドは、私の最後のプロジェクトで機能したため、問題ありません。

私の最後のプロジェクトでは、このようにメインにwhileループを入れました

    public static void main(String[] args) {

    PurchasedList purchasedList = new PurchasedList();

    .
    .
    .

    boolean sameNames = true;
    boolean tooLong = true;
    while (sameNames == true || tooLong == true) {
        System.out.println("\nType seven products.");
        purchasedList.setShopList();
        sameNames = purchasedList.checkName();
        tooLong = purchasedList.checkLength();
    }

しかし今回は、教授がすべての操作をメソッド内で実行するように求めているため、修正を試みます。

過去8時間で自分で解決しようとしましたが、解決できませんでした.

私を助けてください。

ありがとうございました。

4

2 に答える 2

1

この行を追加します。

 if (foundName == true) {
    System.out.println("※ There is a duplicate.  Try it again.");
  ->  name = new ArrayList<String>();
    return true;

現在、配列の末尾に新しい名前を追加し、配列の先頭でそれらを大文字に設定しています。

for (int i=0; i<7; i++) {
        String n = keyboard.nextLine(); //Say I type in g on my second try
        name.add(n); //This add g to the end of the array
        name.set(i,name.get(i).toUpperCase()); //And this sets name[0] to G.
    }

これは、名前配列がリセットされるのではなく、長くなることを意味します。

于 2013-08-02T23:04:51.747 に答える
0

名前をきれいにしたことはありますか?追加し続けているように見えるので、前の入り口はループの次のラウンドでもまだそこにあります. したがって、以前と同じ入力を使用すると、常に重複が発生します (順序は関係ありません)。

この変更により、次のようになります。

while (sameNames == true) {
        name = newArrayList <String>();
        for (int i=0; i<7; i++) {
            String n = keyboard.nextLine();
            name.add(n);
            name.set(i,name.get(i).toUpperCase());
        }
        sameNames = checkName();
    }

そのため、新しい名前ArrayList が毎回作成されます。(ガベージ コレクターは、必要に応じて古いものを処理します。) nameが既に別の場所で作成されている場合は、本当に必要かどうかを考えてください。 setShopList() であるため、これより前は必要ないようです。

于 2013-08-02T23:05:41.343 に答える