我的程序要求用户输入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,它只是用我阵列中的最后一个人替换我要删除的人。我的输出让数组中的最后一个雇员重复了两次(在它的最后一个索引和我想要删除的人的索引中)我该如何解决这个问题?
答案 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)如果您希望获得灵活的数据收集,则可以使用ArrayList
或LinkedList
进行添加/删除。如果需要,可以自行扩展这些Java内置集合。
还有什么:
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";
}
}
}