我有一个数组中的单词(对象)列表。每个单词都有一个数字,单词和提示。 (请不要数字比数组中的索引多1)我希望用户能够删除数组中的项目。我编写了一个读取用户输入(int)单词的方法,并在输入的索引中提示取下一个数组中的提示和单词的值,然后那个将取一个的提示和单词我写了这个方法,但是每次我删除一个单词后,任何单词都会删除数组中的最后一个对象的单词和提示
例如:首先它是
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
秒。我会发现它们,但不幸的是这个项目(如果你想知道的话是Hangman)将于周一到期,所以我不会在这个程序中实现它。
答案 0 :(得分: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());
}
}
最后,它会始终将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());
}
答案 1 :(得分:3)
当你有一个循环时,你有两个循环。使用调试器很容易找到这种错误。
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());
}
这会将每个值复制一次,一次。
答案 2 :(得分: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;