Java中的删除逻辑

Java中的删除逻辑,java,arrays,if-statement,Java,Arrays,If Statement,我不知道如何启动一个方法来删除存储在数组中的特定项 我曾经这样做过: public void deleteEntry() { SName = JOptionPane.showInputDialog("Enter Name to delete: "); for (int i = 0; i < counter; i++) { if (entry[i].getName().equals(SName)) {

我不知道如何启动一个方法来删除存储在数组中的特定项

我曾经这样做过:

public void deleteEntry() {  
        SName = JOptionPane.showInputDialog("Enter Name to delete: ");
        for (int i = 0; i < counter; i++) {
            if (entry[i].getName().equals(SName)) {
                JOptionPane.showMessageDialog(null, "Found!");
                entry[i] = null;
            }
        }
    }

数组是不可变的。可以更改数组中特定索引的值,但不能更改数组大小本身。要“删除”,您可以执行以下操作:

myArray[index]=null


只需将空值视为未设置/已删除的条目。

分配给空值(当前正在执行的操作)是正确的做法。这将消除对该索引处对象的引用,并允许对其进行垃圾收集。

Replace
entry[i]=null使用此选项:

System.arraycopy(entry, i + 1, entry, i, counter - i - 1);
--counter;
entry[counter] = null; // optional; helps with garbage collection
--i; // required to not skip the next element
(我在这里假设
计数器
条目
中的有效条目数。这将在
条目
的第一个
计数器
元素中不留下任何
null
条目(假设没有任何条目)


进一步考虑:如果您需要数组长度始终与有效项的数量匹配,则必须重新分配数组并复制值。只需使用arraycopy将从0到i-1以及从i+1到计数器-1的项复制到新数组中,然后将其分配给
entry
。这不是特别有效,最好避免如果可能,请重新调整大小。

将值指定为null将是最简单的做法。如果您非常挑剔,可以调整数组大小,但这毫无意义。只需保留一个单独的大小计数器,并在每次将某个值设置为null时将其减小

你得到一个空指针异常的另一个原因是,你必须考虑当你用null替换数组中的值,但仍在计数器中迭代时发生了什么。删除时,数组中会有漏洞。第一个解决方案是完全绕过空值,只需将数组向下移动。(有点昂贵的操作)。第二种方法是更改方法以考虑这些空值。例如:

}

我在这台计算机上没有编译器,所以考虑更多的是pSueDO代码。但是这个想法是只跟踪你的地址簿中有多少个非空值,这些空值可以在你的数组的随机位置。我把非空整数添加到一个本地计数器中来跟踪你有多少个值。遇到不为null的值(因此不必强制运行整个通讯簿)。然后,我添加了if语句以确保条目[I]处的值不是null值(尝试对null值调用getInfo()会导致该错误)。最后,我添加了if语句,以在遇到存储的所有非空值时中断循环。希望这能有所帮助。(也可能值得考虑使用LinkedList一起消除空值)


实际上,为了简单起见,除非需要使用数组,否则使用LinkedList可能要好得多,因为需要更改所有方法以将数组中的空空格考虑在内。当然,假设您熟悉LinkedList。

最好是使用带有remove()的列表但如果您真的想使用数组,我建议您将数组更改为List,然后删除所有值,之后您可以始终将List更改为Array

import javax.swing.JOptionPane;
import javax.swing.JOptionPane;

public class Test {

    private static User[] entry = new User[] { new User("Gil"),
            new User("Bil"), new User("John") };

    public static void main(String... args) {
        final Test test = new Test();
        test.deleteEntry();
        for (int index = 0; index < entry.length; index++) {
            User user = entry[index];
        if (user != null)
System.out.println(entry[index]);
        }

    }

    public void deleteEntry() {

        String SName = JOptionPane.showInputDialog("Enter Name to delete: ");
        for (int index = 0; index < entry.length; index++) {
            if (entry[index].getName().equals(SName)) {
                JOptionPane.showMessageDialog(null, "Found!");
                entry[index] = null;
                break;
            }
        }
    }

    private static class User {
        private String name;

        public User(String name) {
            this.name = name;
        }

        /**
         * @return the name
         */
        public String getName() {
            return name;
        }

        @Override
        public String toString() {
            return name;
        }

    }
}
公开课考试{ 私有静态用户[]项=新用户[]{new User(“Gil”), 新用户(“Bil”)、新用户(“John”)}; 公共静态void main(字符串…参数){ 最终测试=新测试(); test.deleteEntry(); for(int index=0;index
谁建议您不要将其赋值为null?您不应该这样做的唯一原因是,如果您使用null来终止循环,这会使循环过早终止。如果您总是在整个列表中循环,则null是最好的方法。编辑:真的吗?这一切都取决于删除此元素时数组是否应小1?否如果你想删除一个条目而不要在集合中留下一个空洞。如果数组是MVC体系结构中的模型(在Swing中非常流行),那么在数组的中间有<代码> null 是非常坏的消息。伙计们……你能和我分享一些代码吗?这将是一个很大的帮助……谢谢。@Ted Hopp爵士…System.arraycopy做什么?它是否将以下条目复制到我删除的条目中(例如将以下条目移动到已删除的数组中)对不起,先生……我还是不明白……我是java新手,还不知道一些内置函数……@ IAMA:这里是函数的描述:但是这真的是你不应该做的。有一些数据结构可以更有效地去除中间的条目,例如链表。@ IAMANAPPRETECE - System.arraycopy的功能与您所猜测的完全相同:它将一个元素块从一个数组移动到另一个数组,或者从同一数组中的一个位置移动到另一个位置。它非常高效,在类内部使用,如
ArrayList
Vector
@Voo-没有理由这样做

public void viewAll() {
    String addText = "  NAME\tADDRESS\tPHONE NO.\tE-MAIL ADD\n\n";
    int nonNull = 0;
    for (int i = 0; i < entry.length; i++) {
       if (entry[i] != null) {
         addText = addText + entry[i].getInfo() + "\n";
         nonNull++;
       }

   if (nonNull == counter) break;

}
JOptionPane.showMessageDialog(null, new JTextArea(addText));
import javax.swing.JOptionPane;

public class Test {

    private static User[] entry = new User[] { new User("Gil"),
            new User("Bil"), new User("John") };

    public static void main(String... args) {
        final Test test = new Test();
        test.deleteEntry();
        for (int index = 0; index < entry.length; index++) {
            User user = entry[index];
        if (user != null)
System.out.println(entry[index]);
        }

    }

    public void deleteEntry() {

        String SName = JOptionPane.showInputDialog("Enter Name to delete: ");
        for (int index = 0; index < entry.length; index++) {
            if (entry[index].getName().equals(SName)) {
                JOptionPane.showMessageDialog(null, "Found!");
                entry[index] = null;
                break;
            }
        }
    }

    private static class User {
        private String name;

        public User(String name) {
            this.name = name;
        }

        /**
         * @return the name
         */
        public String getName() {
            return name;
        }

        @Override
        public String toString() {
            return name;
        }

    }
}