Java - 从Array中删除对象

时间:2014-04-24 00:41:21

标签: java arrays

我需要创建一个方法来从对象数组中删除元素,而不将其转换为ArrayList。

这是我的对象的构造函数:

public Person(String name1, String telno1)
{
    name = name1;
    telno = telno1;
} 

我的阵列:

int capacity = 100;
private Person[] thePhonebook = new Person[capacity]; 

我的删除方法有一个shell:

public String removeEntry(String name)
{
    //name is name of the person to be removed (dont worry about duplicate names)
    //returns the telephone number of removed entry
}

我不知道如何删除数组中的元素(我不想只将值设置为null)

我确实想过创建一个新数组并复制要删除的元素两侧的部分以形成一个新数组,但我不知道如何实现它。

我还有一个find方法,如果有帮助的话,可以用来查找数组中人物的名字:

private int find(String name)
{
    String name1 = name;

    int i = 0;
    int elementNo = 0;
    int found = 0;

    while(i < size)
    {
        if(thePhonebook[i].getName().equals(name1))
        {
            elementNo = i;
            found = 1;
            break;
        }
    }

    if(found == 1)
    {
        return dirNo;
    }
    else
    {
        dirNo = -1;
        return dirNo;
    }
} 

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

要做到这一点,要获取数组中的最后一个索引,然后将其传递给刚刚删除的那个并删除最后一个数组..如果数组是最后一个,那么就不要删除它..

for(int i = 0; i < thePhonebook .length; i++)
{
    if(thePhonebook[i].getName().equals(string))
    {
            if(i == thePhonebook .length - 1)
              thePhonebook[i] = null;
            else
            {
              thePhonebook[i] = null;
              thePhonebook[i] = thePhonebook[thePhonebook .length - 1];
               thePhonebook[thePhonebook .length - 1] = null;
            }
     }
}

答案 1 :(得分:0)

您不能直接从Java中删除数组中的元素。你有两个选择:

:一种。如果必须保留数组中元素的顺序:从要删除的索引开始,并移动每个元素&#34; down&#34;一个索引(朝向索引0),如:

    public String removeEntry(String name)
    {
        String result = null;
        int index = find(name);
        if (index >= 0)
        {
            result = thePhonebook[index].telno;
            for (int i = index + 1; i < thePhonebook.length; ++i)
            {
                thePhonebook[i - 1] = thePhonebook[i];
                if (thePhonebook[i] == null)
                {
                    break;
                }
            }
            thePhonebook[thePhonebook.length - 1] = null;
        }
        return result;
    }

在上面的实现中,数组中的值null表示列表的结尾。

<强> B中。如果数组中元素的顺序并不重要:使用列表的最后一个元素交换要删除的元素。请注意,要执行此操作,您需要维护列表的长度值,即下面代码中的值thePhonebookLength

    public String removeEntry(String name)
    {
        String result = null;
        int index = find(name);
        if (index >= 0)
        {
            result = thePhonebook[index].telno;
            thePhonebook[index] = thePhonebook[thePhonebookLength - 1];
            thePhonebook[--thePhonebookLength] = null;
        }
        return result;
    }

这两种解决方案的好处是阵列就地修改,而不使用分配。

提供这些可能性之后,我建议使用集合更适合您的目的 - 例如List子类之一,或者甚至是Map如果按名称查找是常见的。