2

配列に単語 (オブジェクト) のリストがあります。各単語には、数字、単語、ヒントがあります。(番号が配列内のインデックスよりも 1 大きくならないようにしてください) ユーザーが配列内の項目を削除できるようにしたいです。ユーザー入力 (int) の単語を読み取るメソッドを作成しました。入力のインデックスのヒントは、次の配列のヒントと単語の値を取得し、次の配列のヒントと単語を取得します。それなど。メソッドを作成しましたが、単語を削除するたびに、tat の後の単語は、配列内の最後のオブジェクトの単語とヒントを取得します

例:最初はこんな感じ

1   dog   bark

2 cat meow

3  cow moo

4  chicken cluck

5  pig  oink

ユーザーが 3 で単語を削除した後

1 dog  bark

2  cat meow

3 pig oink

4 pig oink

誰が問題が何であるか教えてもらえますか?

コード

public void deleteWord() throws IOException {

    if (wCount > 0) {
        int again = JOptionPane.YES_OPTION;
        while (again == JOptionPane.YES_OPTION) {
            int num = Integer.parseInt(JOptionPane.showInputDialog(null, "Enter the number of the word you wish to delete", "Enter word number", JOptionPane.PLAIN_MESSAGE))-1;
            int cnfrm = JOptionPane.showConfirmDialog(null, "Are you sure you wish to delete the word:" + "\n" + "\t" + wArr[num].getWrd(), "Are you sure?", JOptionPane.YES_NO_OPTION);
            if (cnfrm == JOptionPane.YES_OPTION) {
                for (int i = num; i < (wCount - 1); i++) {
                    for (int j = (i + 1); j < wCount; j++) {
                        wArr[i].setWrd(wArr[j].getWrd());
                        wArr[i].setHnt(wArr[j].getHnt());
                    }
                }
                wCount--;
                wArr[wCount] = null;
            }
            PrintWriter pw = new PrintWriter(new FileWriter("words.txt", false));
            for (int x = 0; x < wCount; x++) {
                pw.println(wArr[x].toString(1));
            }
            pw.close();
            displayWords();
            again = JOptionPane.showConfirmDialog(null, "Do you wish to delete another word?", "Delete another wod?", JOptionPane.YES_NO_OPTION);
        }
    } else {
        JOptionPane.showMessageDialog(null, "Thre are no words to delete", "ERROR", JOptionPane.ERROR_MESSAGE);
    }

}

編集:

これは宿題です。つまり、明らかに、プログラミングについての割り当てをまだ知らないということです。ArrayList秒。それらについては後で調べますが、残念ながらこのプロジェクト (ご参考までにハングマン) は月曜日に予定されているため、このプログラムでは実装しません。

4

3 に答える 3

4

あなたの問題はこの部分です:

for (int i = num; i < (wCount - 1); i++) {
    for (int j = (i + 1); j < wCount; j++) {
        wArr[i].setWrd(wArr[j].getWrd());
        wArr[i].setHnt(wArr[j].getHnt());
    }
}

最終的に、それは常に position のコンテンツを position のコンテンツに置き換えiますwCount - 1。代わりに次を使用します。

for (int i = num; i < (wCount - 1); i++) {
    int j = i + 1;
    wArr[i].setWrd(wArr[j].getWrd());
    wArr[i].setHnt(wArr[j].getHnt());
}

しかし、あなたの質問へのコメントで示唆されているように:代わりにリスト( ArrayListなど)を使用しないのはなぜですか?

于 2012-09-07T13:29:22.977 に答える
3

ループが 1 つあるはずなのに、ループが 2 つある。この種のバグは、デバッガーを使用して簡単に見つけることができます。

for (int i = num; i < (wCount - 1); i++) {
    for (int j = (i + 1); j < wCount; j++) {
        wArr[i].setWrd(wArr[j].getWrd());
        wArr[i].setHnt(wArr[j].getHnt());
    }
}

削除したい番号のすべての単語について、すべての単語を最後までコピーし、最後の単語が最後になります。

for (int i = num; i < (wCount - 1); i++) {
        wArr[i].setWrd(wArr[i+1].getWrd());
        wArr[i].setHnt(wArr[i+1].getHnt());
}

これにより、各値が 1 つずつ下にコピーされます。

于 2012-09-07T13:31:29.260 に答える
2

このアルゴリズムを使用すると、内部ループの本体で (i, j) のすべての組み合わせを取得し、驚くべきことに、要素 (i) に各 (j) を割り当て、最後に (j) を最後に割り当てます。

ただし、配列内の要素を削除するためにそのようなアルゴリズムは必要ありません。配列の残りの部分をコピーすることをお勧めします。

Word[] newWArr = new Word[wArr.length - 1];
System.arraycopy (wArr, 0, newWArr, 0, num);
System.arraycopy (wArr, num + 1, newWArr, num, wArr.length - num - 1);
wArr = newWArr;
于 2012-09-07T14:02:47.110 に答える