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

时间:2016-02-06 14:40:51

标签: java arraylist

我想创建一个程序,在要求用户输入他们想要移除的工资单编号之前,显示ArrayList中的当前员工。然后,用户应输入三名工作人员之一的工资单编号,然后按Enter键。按Enter键后,程序应从阵列列表中删除该特定工作人员并再次显示整个列表(错过了他们已明显删除的工作人员)。如果用户不再希望删除任何工资单编号,则工资单编号条目应为0,然后应再次显示该列表的内容。

我遇到的问题是删除部分。

我已经推荐了两种方法来实现这一目标:

此搜索&#39;方法应返回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;
    }
}

4 个答案:

答案 0 :(得分:4)

考虑使用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(),请找回找到的人员p并致电if (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);
}

答案 1 :(得分:1)

您的搜索方法不应该返回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"));

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

创建一个Hashmap,其中ID为键,Personnel对象为值。这将有助于在O(1)时间和删除中识别人员。

只有在知道要读取值的索引时才应使用ArrayList。然后它在O(1)中完成。如果不是,它是O(n)并且不如HashMap有效。