【发布时间】:2016-02-06 14:40:51
【问题描述】:
我想创建一个程序,在要求用户输入他们想要删除的工资单号之前,在 ArrayList 中显示当前员工。然后,用户应输入三名员工之一的工资单号,然后按 Enter。按下回车后,程序应该从数组列表中删除该特定员工并再次显示整个列表(显然错过了他们删除的员工)。如果用户不再希望删除任何工资单编号,则工资单编号条目应为 0,然后应再次显示列表的内容。
我遇到的问题是删除部分。
有人向我推荐了两种实现这一目标的方法:
这个“搜索”方法应该返回 ArrayList 中的位置(以便可以使用 remove(<index>))或对对象的引用(以便可以使用 remove(<objectRef>))。如果未找到该职员,则搜索方法应返回 -1(如果正在使用 remove(<index>))或 null(如果正在使用 remove(<objectRef>))。
但是我不确定如何在 Java 中实现这一点。
这是我的文件结构:
ArrayListTest.java
import java.util.*;
import personnelPackage.Personnel;
public class ArrayListTest
{
static Scanner keyboard = new Scanner(System.in);
public static void main(String[] args)
{
long searchQuery;
ArrayList<Personnel> staffList = new ArrayList<Personnel>();
Personnel[] staff =
{new Personnel(123456,"Smith","John"),
new Personnel(234567,"Jones","Sally Ann"),
new Personnel(999999,"Black","James Paul")};
for (Personnel person:staff)
staffList.add(person);
do
{
showDisplay(staffList);
System.out.print("\nPlease enter a payroll number to search: ");
searchQuery = keyboard.nextLong();
searchForPayrollNumber(staffList, searchQuery);
}while(!(searchQuery == 0));
}
private static void showDisplay(ArrayList<Personnel> staffList)
{
System.out.print("\n------------- CURRENT STAFF LIST -------------\n");
for (Personnel person : staffList)
{
System.out.println("Payroll number: " + person.getPayNum());
System.out.println("Surname: " + person.getSurname());
System.out.println("First name(s): " + person.getFirstNames() + "\n");
}
}
public static void searchForPayrollNumber(ArrayList<Personnel> staffList, long searchQuery)
{
long index = staffList.indexOf(searchQuery);;
for (Personnel person: staffList)
{
if (person.getPayNum() == searchQuery)
{
System.out.print("\n------------- Staff member found and removed! -------------");
System.out.println("\n\nFirst Name(s): " + person.getFirstNames());
System.out.println("\nSurname: " + person.getSurname());
System.out.print("\n-----------------------------------------------");
staffList.remove(index);
return;
}
}
System.out.print("\n------------- No staff members found. Program terminated -------------");
return;
}
}
Personnel.java(在自己的名为personnelPackage的包中)
package personnelPackage;
public class Personnel
{
private long payrollNum;
private String surname;
private String firstNames;
public Personnel(long payrollNum, String surname, String firstNames)
{
this.payrollNum = payrollNum;
this.surname = surname;
this.firstNames = firstNames;
}
public long getPayNum()
{
return payrollNum;
}
public String getSurname()
{
return surname;
}
public String getFirstNames()
{
return firstNames;
}
public void setSurname(String newName)
{
surname = newName;
}
}
【问题讨论】:
-
您不能在增强的 for 循环中从列表中删除
-
“staffList.indexOf(searchQuery);”如何当 searchQuery 很长并且 staffList 是 ArrayList
? 时工作 -
@ShireResident 这是因为来自
Personnel.java文件/ Personnel 类的getPayNum()方法。 -
@Olehi - 它会返回 - 1,但因为您正在比较两种不同的类型。一个 long 与 Personnel 类,你没有实现 equals 方法或 hashcode 方法,所以如果你使用正确的类型,我认为 indexOf 不能正常工作