从数组中删除对象[java]

时间:2014-03-28 16:57:40

标签: java arrays

我的程序要求用户输入5个人的名字,姓氏和年龄,并将它们存储在一个数组中。我想编写一个方法,询问用户要从阵列中删除谁,然后删除该员工。我知道在数组中你不能从技术上删除数组中的对象,只需替换它。 这就是我到目前为止所做的:

private void deleteEmployee(){

       Scanner scan = new Scanner(System.in);
       System.out.println("Enter the first name of the employee you want to delete from the list")
      String name = scan.nextLine();

       for (int i = 0; i < employees.length; i++) {
           if (employees[i].getFirstName().equals(name)){
               employees[i] = employees[employees.length - 1];
             break; 
           }

           if (i == employees.length - 1) {
               System.out.println("That requested person is not employed at this firm.")
       }


}

我的问题是它不会将数组大小减少1,它只是用我阵列中的最后一个人替换我要删除的人。我的输出让数组中的最后一个雇员重复了两次(在它的最后一个索引和我想要删除的人的索引中)我该如何解决这个问题?

8 个答案:

答案 0 :(得分:2)

您可能希望使用ArrayLists来解决此问题。 ArrayLists是Java创建可变数组的方法。使用arraylists,可以根据Array中的对象数自动扩展和缩小数组。

您可以使用索引或变量名称添加和删除对象。

示例代码:

ArrayList<Employee> employees = new ArrayList<>;

然后您可以使用以下方法:

employees.remove(int index);
employees.remove(Object o);

请查看此内容以获取更多参考:http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

答案 1 :(得分:1)

Java中数组的长度无法更改,在创建时会初始化。 并且您不能立即手动删除元素(如C ++)。您可以将其设置为null,然后等待JVM回收它。

为方便起见,您可以在java.util包中使用List集合。它们便于删除/添加元素。

答案 2 :(得分:0)

只要想删除员工,就可以将员工替换为null。在插入新的emplyee时,您可以先查看空索引并放置它。

private void deleteEmployee(){

  Scanner scan = new Scanner(System.in);
  System.out.println("Enter the first name of the employee you want to delete from the list")
  String name = scan.nextLine();

  for (int i = 0; i < employees.length; i++) {
       if (employee[i] != null && employees[i].getFirstName().equals(name)){
           employees[i] = null;
         break; 
       }

       if (i == employees.length - 1) {
           System.out.println("That requested person is not employed at this firm.")
  }
}

答案 3 :(得分:0)

我建议你使用ArrayList,它已经有了remove方法。该方法还会使列表的大小减少已删除项目的数量

答案 4 :(得分:0)

一种可能性:虽然您无法更改数组的实际长度,但您可以使用另一个变量来跟踪&#34;真实&#34; length(即您知道的数组中元素的数量有效):

  int currentLength = employees.length;
  for (int i = 0; i < currentLength; i++) {
       if (employees[i].getFirstName().equals(name)){
           employees[i] = employees[currentLength - 1];
           // employees[currentLength - 1] = null;   ... could help reclaim storage
           currentLength--;
         break; 
       }

       if (i == currentLength - 1) {
           System.out.println("That requested person is not employed at this firm.")
   }

该计划只是&#34;知道&#34;从employees[currentLength]employees[employees.length - 1]的数组元素没有意义。您还可以将这些无意义的元素设置为null,这样就没有未使用的引用可以防止某些对象被垃圾收集(这在较大的程序中很重要)。这种方法可能有点容易出错,因为您必须记住使用currentLength而不是employees.length。总的来说,我认为最好使用ArrayList,它有办法删除元素。

答案 5 :(得分:0)

如果您使用ArrayList而不是array,事情会更简单。假设您有EmployerClass实现{getFirstName(),您的代码就会如此1}}方法

List<EmployerClass> employees = new ArrayList<EmployerClass>();
// Here is the new type of your employees pool

....
// do whatever you want to put employees in the poll using employees.add(...)

private void deleteEmployee(){

       Scanner scan = new Scanner(System.in);
       System.out.println("Enter the first name of the employee you want to delete from the list")
       String name = scan.nextLine();

       EmployerClass tmpEmployer = null;

       for(EmployerClass emp : employees) {
           if(emp.getFirstName().equals(name)) {            
               break;
           }
       }

       if(tmpEmployer != null){
         // remove the employee to the pool
         employees.remove(tmpEmployer);

       } else {

         System.out.println("That requested person is not employed at this firm.");

       }        
}
祝你好运!

答案 6 :(得分:0)

你无法真正删除它,但你只能将其删除。

ArrayList LinkedList 更适合此任务。在两者中,您都可以使用内置方法添加或删除元素,并自动处理大小。

答案 7 :(得分:0)

有一些观点:

(1)Java数组(使用符号&#34; []&#34;)是固定大小的结构。这意味着您必须在创建数组时指定数组的大小(长度)。像这样:

int[] intArray = new int[10];

特定大小的目的是告诉Java编译器分配内存。数组在连续内存中分配。分配完成后,其大小无法更改。(您可以映像有其他数据&#34;后面&#34;数组,如果数组是extende,将与其他数据重叠。)

(2)如果您希望获得灵活的数据收集,则可以使用ArrayListLinkedList进行添加/删除。如果需要,可以自行扩展这些Java内置集合。 还有什么:

  • ArrayList由Java数组实现,它将自动创建一个新的更大的数组,并在容量不足时将数据复制到其中。它在循环中具有良好的性能,通过索引访问元素。
  • LinkedListLinked List实施。它在插入/删除元素方面具有良好的性能。
  • 对于这两个列表,如果您想正确使用remove(Object o),则必须实现对象的public boolean equals(Object)功能。

参考代码:

import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;

public class ListTest {

    public static void main(String[] args) {
        List<Employee> employees = new LinkedList<Employee>();
//      List<Employee> employees = new ArrayList<Employee>();
        // Add 3 employees
        employees.add(new Employee("Tom", "White", 10));
        employees.add(new Employee("Mary", "Black", 20));
        employees.add(new Employee("Jack", "Brown", 30));
        // See what are in the list
        System.out.println(employees);
        // Remove the 2nd one.
        employees.remove(new Employee("Mary", "Black", 20));
        // See what are in the list after removing.
        System.out.println(employees);
    }

static class Employee {     
    private String firstName;
    private String lastName;
    private int age;

    public Employee(String firstName, String lastName, int age) {
        super();
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if(super.equals(obj)) {
            return true;
        }
        else {
            if(obj.getClass() == Employee.class) {
                Employee that = (Employee)obj;
                return firstName.equals(that.getFirstName()) && lastName.equals(that.getLastName()) && (age == that.getAge());
            }
            else {
                return false;
            }
        }
    }

    @Override
    public String toString() {
        return "Employee [firstName=" + firstName + ", lastName="
                + lastName + ", age=" + age + "]\n";
    }

}

}