Java 删除通讯录中的条目
我被要求制作一个电话簿,保存条目并打电话给他们。然后老师增加了一项新任务。程序应该删除条目。他给了我们一个方法,说我们不允许使用ArrayList或Hashmaps,只允许使用数组。我试了很多,但似乎都做不好,有人能帮我改正错误吗? 有两类: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
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个数组中执行。我知道了!非常感谢你的帮助帮助我。