Java 删除/替换数组中的对象

Java 删除/替换数组中的对象,java,arrays,swing,Java,Arrays,Swing,我有一个数组中的单词(对象)列表。每个单词都有数字、单词和提示。(请不要让数字比数组中的索引多1)我希望用户能够删除数组中的项目。我写了一个方法,读取用户输入(int)单词,输入索引中的hint取下一个数组中的hint和word的值,然后一个数组将取下一个数组中的hint和word,等等。我已经编写了这个方法,但是每次我删除一个单词时,tat之后的任何单词都会取数组中最后一个对象的word和hint 首先是这样 1 dog bark 2 cat meow 3 cow moo 4

我有一个数组中的单词(对象)列表。每个单词都有数字、单词和提示。(请不要让数字比数组中的索引多1)我希望用户能够删除数组中的项目。我写了一个方法,读取用户输入(int)单词,输入索引中的hint取下一个数组中的hint和word的值,然后一个数组将取下一个数组中的hint和word,等等。我已经编写了这个方法,但是每次我删除一个单词时,tat之后的任何单词都会取数组中最后一个对象的word和hint

首先是这样

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()引发IOException{
如果(wCount>0){
再次int=JOptionPane.YES\u选项;
while(同样==JOptionPane.YES\u选项){
int num=Integer.parseInt(JOptionPane.showInputDialog(null,“输入要删除的单词的编号”,“输入单词编号”,JOptionPane.PLAIN_消息))-1;
int cnfrm=JOptionPane.showConfirmDialog(null,“是否确实要删除单词:”+“\n”+“\t”+wArr[num].getWrd(),“是否确定?”,JOptionPane.YES\u NO\u选项);
如果(cnfrm==JOptionPane.YES\u选项){
对于(int i=num;i<(wCount-1);i++){
对于(int j=(i+1);j
编辑:
这是一个家庭作业,这显然意味着我仍然不知道如何编程,包括
ArrayList
s。我会找到他们,但不幸的是,这个项目(Hangman,如果你想知道的话)将在周一到期,所以我不会在这个项目中实施它。

你的问题是这一部分:

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());
    }
}

但是正如你的问题的评论中所建议的:为什么不使用(like)来代替呢?

当你应该有一个循环时,你有两个循环。使用调试器很容易发现这种bug

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++){
对于(int j=(i+1);j
对于要删除的数字中的每个单词,您都将每个单词复制到结尾,最后一个是结尾

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

该算法将每个值向下复制一次。

使用该算法,它将获得内部循环体中(i,j)的所有组合,令人惊讶地将每个(j)和最后一个(j)分配给元素(i)

但是您不需要这样的算法来删除数组中的元素。您最好复制阵列的其余部分

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;

这不是问题的答案,而是为什么不使用ArrayList()?
for (int i = num; i < (wCount - 1); i++) {
        wArr[i].setWrd(wArr[i+1].getWrd());
        wArr[i].setHnt(wArr[i+1].getHnt());
}
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;