繁体   English   中英

使用remove()从ArrayList中删除项目 <index> )或删除( <objectRef> )

[英]Removing item from ArrayList using remove(<index>) or remove(<objectRef>)

我想创建一个程序,在要求用户输入他们想要删除的工资单输入之前,在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;
    }
}

考虑使用Iterator进行搜索和删除:

Iterator<Personnel> i = staffList.iterator();
while (i.hasNext()) {
    Personnel p = i.next();
    if (p.getPayNum() == searchQuery) {
        // print message
        i.remove();
        return p;
    } 
}
return null;

如果严格要求使用List#remove() ,请返回找到的人员pif (p != null) staffList.remove(p)调用:

public static Personnel searchByPayNum(List<Personnel> ps, long num) {
    for (Personnel p : ps) {
        if (p.getPayNum() == num)
            return p;
    }
    return null;
}

并在调用方代码中:

Personnel p = searchByPayNum(staffList, query);
if (p != null) {
    // log
    staffList.remove(p);
}

您的搜索方法不应返回void。 它应该返回int或long,

public static long searchForPayrollNumber(ArrayList<Personnel> staffList, long searchQuery)
{
 int index = -1;
 for (int i = 0; i < staffList.size(); i++){
     if(staffList.get(i).getPayNum() == searchQuery){
     index = i;
     System.out.print("\n------------- Found Staff member at position " + index + " in the list");
     break;         
     }
 } 
if (index != -1){
    staffList.remove(index);
    System.out.print("\n------------- Removed the staff member");  
}          
 return index;
}

最后一种方法返回了索引。 现在,当您想返回对象时:

public static long searchForPayrollNumber(ArrayList<Personnel> staffList, long searchQuery)
{
 Personnel p = null;
 for (int i = 0; i < staffList.size(); i++){
     if(staffList.get(i).getPayNum() == searchQuery){
     p = staffList.get(i);
     break;         
     }
 }          
 staffList.remove(p);     
 return p;
} 

您必须知道,将其从列表中删除后,它将把所有后续元素向左移动(从其索引中减去一个)。

另外,只是一个建议:

代替

Personnel[] staff =
        {new Personnel(123456,"Smith","John"),
         new Personnel(234567,"Jones","Sally Ann"),
         new Personnel(999999,"Black","James Paul")};

为什么不

staffList.add(new Personnel(123456,"Smith","John"));
staffList.add(new Personnel(234567,"Jones","Sally Ann"));
staffList.add(new Personnel(999999,"Black","James Paul"));
public static long searchForPayrollNumber(ArrayList<Personnel> staffList, long searchQuery) {
    //long index = staffList.indexOf(searchQuery);

for(int i = 0; i < staffList.size(); i++) {
    if (staffList.get(i).getPayNum() == searchQuery) {
        System.out.print("\n------------- Staff member found and removed! -------------");
        System.out.println("\n\nFirst Name(s): " + staffList.get(i).getFirstNames());
        System.out.println("\nSurname: " + staffList.get(i).getSurname());
        System.out.print("\n-----------------------------------------------");

        //staffList.remove(i);
        return i;
    }
}
System.out.print("\n------------- No staff members found. Program terminated -------------");
return -1;
}

这只是一个建议。 由于搜索和删除是您的主要目标,因此ArrayList不是要使用的正确集合。

创建一个ID为键,人员对象为值的Hashmap。 这将有助于在O(1)时间内识别人员,并将其撤职。

仅当您知道要读取的索引值时,才应使用ArrayList。 然后在O(1)中执行该操作。 如果不是,则为O(n),效率不如HashMap。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM