Java 删除通讯录中的条目

Java 删除通讯录中的条目,java,arrays,swing,Java,Arrays,Swing,我被要求制作一个电话簿,保存条目并打电话给他们。然后老师增加了一项新任务。程序应该删除条目。他给了我们一个方法,说我们不允许使用ArrayList或Hashmaps,只允许使用数组。我试了很多,但似乎都做不好,有人能帮我改正错误吗? 有两类:PhoneBook和UI import javax.swing.ButtonGroup; import javax.swing.JOptionPane; import javax.swing.JRadioButton; public class Ph

我被要求制作一个电话簿,保存条目并打电话给他们。然后老师增加了一项新任务。程序应该删除条目。他给了我们一个方法,说我们不允许使用ArrayList或Hashmaps,只允许使用数组。我试了很多,但似乎都做不好,有人能帮我改正错误吗? 有两类:
PhoneBook
UI

    import javax.swing.ButtonGroup;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
public class PhoneBook {
    private static int maxSize = 100; 
    private static int actSize = 0; 
    private static String[] name = new String[maxSize]; 
    private static String[] firstName = new String[maxSize]; 
    private static String[] number = new String[maxSize]; 
    public static String findEntry(String nameP, String firstNameP) {
        for (int i = 0; i < actSize; i++) {
            if (name[i].equals(nameP) && firstName[i].equals(firstNameP)) {
                return number[i];
            }
        }
        return null;
    }
    public static void addEntry(String nameP, String firstNameP, String numberP) {
        if (actSize == maxSize) {
            System.err.println("Memory full!");
            return;
        }
        for (int i = 0; i < actSize; i++) {
            if (name[i].equals(nameP) && firstName[i].equals(firstNameP)) {
                System.err.println("It exists already!");
                return;
            }
        }
        name[actSize] = nameP;
        firstName[actSize] = firstNameP;
        number[actSize] = numberP;
        actSize = actSize + 1;
    }
    public static String getActionDialog(String... actions) { 
        JRadioButton[] buttons = new JRadioButton[actions.length];
        ButtonGroup group = new ButtonGroup();
        for (int i = 0; i<actions.length; i++) {
            buttons[i] = new JRadioButton(actions[i]);
            group.add(buttons[i]);
        }
    buttons[0].setSelected(true);
    Object[] message = buttons;
    Object[] options = { "OK", "Cancel"};
    int n= JOptionPane.showOptionDialog(null,
            message,
            "Choose an Action",
            JOptionPane.YES_NO_OPTION,
            JOptionPane.QUESTION_MESSAGE,
            null,
            options,
            options[0]);
    if(n==JOptionPane.OK_OPTION){
        for (int i = 0; i<actions.length; i++) {
            if(buttons[i].isSelected()){
                return actions[i];
            }
        }
    }
    return null;
    }
    /**
     * Deletes Entries.
     * An entry matches the pattern if it fits in all components (name, first name, number).
     * A component fits, when it is equal to the sample component, or the component pattern of the empty string.
     * 
     * @param nameP         Pattern for the name of the entries to be deleted.
     * @param firstNameP    Pattern for the first names of the entries to be deleted.
     * @param numberP       Pattern for the number of entries to be deleted.
     * @post  all matching entries are deleted. The capacity remains unchanged.
     *        The size is adjusted.
     * @return Number of deleted entries.
     */
    public static int deleteMatchingEntries(String nameP, String firstNameP,
        String numberP) {
    for (int i = 0; i < actSize; i++) {
        if (name[i].equals(nameP)) {
            name[i] = name[i + 1];

            actSize--;
        } else if (firstName[i].equals(firstNameP)) {
            firstName[i] = firstName[i + 1];

            actSize--;
        } else if (number[i].equals(numberP)) {
            number[i] = number[i + 1];

            actSize--;
        }
    }
    return actSize;
}
}



import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class UI {
    public static void main(String[] args) {
        while (true) {
            String action = PhoneBook.getActionDialog(
                    "Create an entry", "Call up an entry","Delete Entry");
            if (action == null) {
                break;
            }
            if (action.equals("Create an entry")) {
                String[] entryData = getEntryDataDialog();
                if (entryData != null) {
                    PhoneBook.addEntry(entryData[0], entryData[1],
                            entryData[2]);
                }
            } else if (action.equals("Call up an entry")) {
                String[] queryData = getQueryDataDialog();
                if (queryData != null) {
                    String nr = PhoneBook.findEntry(queryData[0],
                            queryData[1]);
                    if (nr == null) {
                        JOptionPane.showMessageDialog(null, "Not found");
                    } else {
                        JOptionPane.showMessageDialog(null, "Last Name: "
                                + queryData[0] + ", First Name: " + queryData[1]
                                + ", Number:" + nr);
                    }
                }else if (action.equals("Delete Entry")) {
            String[] delete = getEntryDataDialog();
            if (delete != null) {
                TelephoneDirectory.deleteMatchingEntries(delete[0],
                        delete[1], delete[2]);

                JOptionPane.showMessageDialog(null, "Entry deleted");

            }
        } else {
                System.err.println("Error: unknow Action " + action);
                break;
            }
        }
    }
    private static String[] getEntryDataDialog() {
        JTextField nameTF = new JTextField();
        JTextField firstNameTF = new JTextField();
        JTextField numberTF = new JTextField();
        Object[] message = { "Last Name", nameTF, "First Name", firstNameTF, "Number",
                numberTF };
        Object[] options = { "OK", "Cancel" };
        int n = JOptionPane.showOptionDialog(null, message, "Create an entry",
                JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null,
                options, options[0]);
        if (n == JOptionPane.OK_OPTION) { 
            return new String[] { nameTF.getText(), firstNameTF.getText(),
                    numberTF.getText() };
        } else if (n == JOptionPane.NO_OPTION
                || n == JOptionPane.CLOSED_OPTION) { 
            return null;
        } else {
            return null;
        }
    }
    private static String[] getQueryDataDialog() {
        JTextField nameTF = new JTextField();
        JTextField firstNameTF = new JTextField();
        Object[] message = { "Last Name", nameTF, "First Name", firstNameTF };
        Object[] options = { "OK", "Cancel" };
        int n = JOptionPane.showOptionDialog(null, message, "Call up an entry",
                JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null,
                options, options[0]);
        if (n == JOptionPane.OK_OPTION) { 
            return new String[] { nameTF.getText(), firstNameTF.getText() };
        } else if (n == JOptionPane.NO_OPTION 
                || n == JOptionPane.CLOSED_OPTION) { 
            return null;
        } else {
            return null;
        }
    }
}
import javax.swing.ButtonGroup;
导入javax.swing.JOptionPane;
导入javax.swing.JRadioButton;
公共类电话簿{
私有静态int maxSize=100;
私有静态int actSize=0;
私有静态字符串[]名称=新字符串[maxSize];
私有静态字符串[]firstName=新字符串[maxSize];
私有静态字符串[]编号=新字符串[maxSize];
公共静态字符串findEntry(字符串nameP、字符串firstNameP){
对于(int i=0;i对于(int i=0;i而言,您遇到的问题是,删除条目时只向上移动一条记录

以下是您可以做的一些更改:

1-(如果老师允许)创建一个PhoneEntry类,该类将包含一个姓名、姓氏和号码

2-(如果允许,请再次)将3个数组更改为PhoneEntry对象的一个数组(这样更易于处理)

3-当执行删除操作时,您不需要向上移动下一个条目,您只需在删除PhoneEntry的位置上输入null。此外,您将actSize的含义更改为ACTQUOTITY,对于下一个条目添加,您将搜索数组中第一个具有null值的位置


干杯

您应该使用单个数组,例如班级联系人或其他

如果你看:

public static int deleteMatchingEntries(String nameP, String firstNameP,
        String numberP) {
    for (int i = 0; i < actSize; i++) {
        if (name[i].equals(nameP)) {
            name[i] = name[i + 1];

            actSize--;
        } else if (firstName[i].equals(firstNameP)) {
            firstName[i] = firstName[i + 1];

            actSize--;
        } else if (number[i].equals(numberP)) {
            number[i] = number[i + 1];

            actSize--;
        }
    }
    return actSize;
}
public static int deleteMachingEntries(字符串nameP、字符串firstNameP、,
字符串编号(RP){
对于(int i=0;i
假设在数组中的[0]位置有这样的“Doe,John,555-5555”。函数将删除Doe,然后保留John和555。突然,索引不匹配


此外,我将使用deleteMatchingEntries并将数组删除逻辑重构到一个单独的函数中,您可以单独测试。

您看到了什么错误?您尝试了什么?请问一个更具体的问题。您的错误是什么?您应该发布它给您带来的具体问题,而不是让别人去做阅读所有代码,找出可能出现的问题。对不起,如果我保存一些条目并尝试删除其中一个条目,假设我要删除第三个条目,如果我删除第三个条目的姓氏,则第四个条目的姓氏将取代删除的姓氏,第五个条目将被完全删除,并且姓名和号码将被删除第三个条目的属性不会改变。我同意这里的说法,如果你不需要的话,使用3个单独的数组是没有意义的。不幸的是,这是不允许的。@user3054620虽然不允许使用单个类,但建议编号3将纠正你的删除问题,但是你必须在3个数组中执行。我知道了!非常感谢你的帮助帮助我。