Логика удаления в Java - PullRequest
       2

Логика удаления в Java

0 голосов
/ 18 февраля 2011

Я не могу понять, как запустить метод для удаления конкретной записи, хранящейся в массиве ...

Я делал это:

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

, но мне посоветовали неприсвоить entry[i] значение NULL, потому что это разрушит мои записи ...

Я понятия не имею, как его кодировать другим способом ...

Что мне нужно сделать, это: Мне нужно удалить конкретную запись из массива, пожалуйста, помогите ...

также ... его вывод был ошибкой, он говорит:

Исключение в потоке "основной" Java.lang.NullPointerException
в AddressBook.viewAll (AddressBook.java:62)
в AddressBook.main (AddressBook.java:36)
Результат Java: 1

Это мойкод в моей основной программе:

public class AddressBook {

    private AddressBookEntry entry[];
    private int counter;
    private String SName;

    public static void main(String[] args) {
        AddressBook a = new AddressBook();
        a.entry = new AddressBookEntry[100];
        int option = 0;
        while (option != 5) {
            String content = "Choose an Option\n\n"
                    + "[1] Add an Entry\n"
                    + "[2] Delete an Entry\n"
                    + "[3] Update an Entry\n"
                    + "[4] View all Entries\n"
                    + "[5] View Specific Entry\n"
                    + "[6] Exit";
            option = Integer.parseInt(JOptionPane.showInputDialog(content));
            switch (option) {
                case 1:
                    a.addEntry();
                    break;
                case 2:
                    a.deleteEntry();
                    break;
                case 3:
                    a.editEntry();
                    break;
                case 4:
                    a.viewAll();
                    break;
                case 5:
                    a.searchEntry();
                    break;
                case 6:
                    System.exit(1);
                    break;
                default:
                    JOptionPane.showMessageDialog(null, "Invalid Choice!");
            }
        }
    }

    public void addEntry() {
        entry[counter] = new AddressBookEntry();
        entry[counter].setName(JOptionPane.showInputDialog("Enter name: "));
        entry[counter].setAdd(JOptionPane.showInputDialog("Enter add: "));
        entry[counter].setPhoneNo(JOptionPane.showInputDialog("Enter Phone No.: "));
        entry[counter].setEmail(JOptionPane.showInputDialog("Enter E-mail: "));
        counter++;
    }

    public void viewAll() {
        String addText = "  NAME\tADDRESS\tPHONE NO.\tE-MAIL ADD\n\n";
        for (int i = 0; i < counter; i++) {
            addText = addText + entry[i].getInfo() + "\n";
        }
        JOptionPane.showMessageDialog(null, new JTextArea(addText));
    }

    public void searchEntry() {
        int notfound = 0;
        SName = JOptionPane.showInputDialog("Enter Name to find: ");
        for (int i = 0; i < counter; i++) {
            if (entry[i].getName().equals(SName)) {
                JOptionPane.showMessageDialog(null, entry[i].getInfo2());
                break;
            } else {
                notfound++;
            }
        }
        if (notfound != 0) {
            JOptionPane.showMessageDialog(null, "Name Not Found!");
        }
        notfound = 0;
    }

    public void editEntry() {
        int notfound = 0;
        SName = JOptionPane.showInputDialog("Enter Name to edit: ");
        for (int i = 0; i < counter; i++) {
            if (entry[i].getName().equals(SName)) {
                entry[i] = new AddressBookEntry();
                entry[i].setName(JOptionPane.showInputDialog("Enter new name: "));
                entry[i].setAdd(JOptionPane.showInputDialog("Enter new add: "));
                entry[i].setPhoneNo(JOptionPane.showInputDialog("Enter new Phone No.: "));
                entry[i].setEmail(JOptionPane.showInputDialog("Enter new E-mail: "));
                break;
            } else {
                notfound++;
            }
        }
        if (notfound != 0) {
            JOptionPane.showMessageDialog(null, "Name Not Found!");
        }
        notfound = 0;
    }

    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;
                break;
            }
        }
    }
}

Ответы [ 6 ]

1 голос
/ 18 февраля 2011

Назначение значений на ноль будет самой простой практикой.Если вы действительно требовательны, вы можете изменить размер массива, но это будет довольно бессмысленно.Просто держите отдельный счетчик размеров и уменьшайте его каждый раз, когда вы устанавливаете что-либо в null.

Другая причина, по которой вы получаете исключение нулевого указателя, заключается в том, что вы должны учитывать, что происходит при замене значений в вашем массиве.с нулевым, но все еще итерацией по счетчику.Вы будете иметь дыры в массиве после удаления.Первым решением было бы вообще обойти нулевые значения и просто сдвинуть ваш массив вниз (что является довольно дорогой операцией).Второе - изменить ваши методы, чтобы учесть эти нулевые значения.Пример:


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++;
       }</p>

<code>   if (nonNull == counter) break;

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

}

У меня нет компилятора на этом компьютере, поэтому рассмотрим его скорее как псевдо-код.Но идея в том, что счетчик отслеживает только то, сколько ненулевых значений у вас есть в вашей адресной книге, и что эти нулевые значения могут находиться в произвольных местах вашего массива.Я добавил ненулевое целое число в качестве локального счетчика, чтобы отслеживать количество значений, с которыми вы столкнулись, которые не равны нулю (поэтому вы не обязаны проходить всю адресную книгу).Затем я добавил оператор if, чтобы гарантировать, что значение в entry [i] не является нулевым значением (попытка вызвать getInfo () для нулевого значения - это то, что дает вам эту ошибку).Наконец, я добавил оператор if, чтобы разорвать цикл, если вы столкнулись со всеми ненулевыми значениями, которые вы сохранили.Надеюсь это поможет.(Также, возможно, стоит рассмотреть LinkedList, чтобы исключить все нулевые значения).

На самом деле, для простоты, вам, вероятно, гораздо лучше использовать LinkedList, если только вы не обязаны использовать массив, так каквам нужно будет изменить все ваши методы, чтобы учесть пустые места в вашем массиве.Если вы, конечно, знакомы с LinkedLists.

0 голосов
/ 18 февраля 2011
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;
        }

    }
}
0 голосов
/ 18 февраля 2011

Лучше для этого является List, который имеет метод remove (). Но если вы действительно хотите использовать Array, я рекомендую изменить Array на List, а затем удалить все значения, после этого вы всегда можете изменить List на Array

0 голосов
/ 18 февраля 2011

Заменить 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

(я предполагаю, что counter - это число действительных записей в entry. Это не оставит null записей среди первых counter элементов entry (при условии, что любой для начала).

Дальнейшая мысль: если вам нужно, чтобы длина массива всегда соответствовала количеству допустимых записей, вам придется перераспределить массив и скопировать значения. Просто используйте arraycopy, чтобы скопировать записи с 0 по i-1 и с i + 1 на counter-1 в новый массив, а затем назначить его entry. Это не особенно эффективно и лучше избегать, если это возможно.

0 голосов
/ 18 февраля 2011

Назначение нуля (в настоящее время то, что вы делаете) - это то, что нужно делать. Это исключит ссылку на объект по этому индексу и позволит собирать мусор.

0 голосов
/ 18 февраля 2011

Массивы неизменны. Вы можете изменить значение для определенного индекса в массиве, но вы не можете изменить размер самого массива. Чтобы «удалить», вы можете сделать:

myArray [index] = null;

И просто обрабатывать нулевые значения как неустановленные / удаленные записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...