有人可以告诉我如何从数组中删除对象吗?但这里有一个问题(对我来说很好),数组是这样的
member[0] = new Member("John Cena" , "p000001");
我希望能够搜索一个名称,然后在检测到该名称时,能够删除。可能吗?
public static void remove(){
System.out.println("Name: ");
String removeName = input.next();
System.out.println("ID: ");
String removeID = input.next();
for(int i = 0; i < member.length; i++){
//not sure if this is the right direction
}
}
编辑:由于分配中的要求,无法使用 ArrayList 或列表。会使用它,因为它更容易,但不能。
ArrayList
(或者更好的是ArrayList<Member>
),您可以使用成员填充该,然后使用indexOf
方法进行搜索。
或者,如果您必须或更愿意使用数组,请创建一个循环,就像您拥有的那样,循环访问members
数组的每个索引。唯一棘手的部分是删除需要您将其从数组中删除,然后将它前面的每个索引向下移动,以便删除空格。
换句话说,您需要删除索引i
并使用循环,以便将成员向下移动到i + 1
i
,成员i + 2
向下移动到i + 1
,依此类推,直到到达数组的末尾。
综上所述,我鼓励使用ArrayList
。它完成了我刚刚为您描述的所有操作,并使事情变得容易得多。
数组是固定大小的。这意味着您可以对对象数组执行的最佳操作是将值设置为 null。如果要完全删除它,则需要改用ArrayList
。在这种情况下,
ArrayList<Member> members = new ArrayList<Member>();
for (int i = members.length-1; i>=0; i--) {
if (members.get(i).getName().equals(toRemove)) {
members.remove(i);
}
}
对不起,我之前的回答错误。这应该是删除会员的正确方法
List<Member> l = new ArrayList<>(Arrays.asList(member));
for (Iterator<Member> iter = l.listIterator(); iter.hasNext(); ) {
Member a = iter.next();
if ( (a.getId() == removeID) || (removeName.equals(a.getName)) ) {
iter.remove();
}
}
Member[] newMembers = l.toArray(new Member[l.size()]);
PS:请像这样获取删除ID;
int removeID = input.nextInt();
你必须使用数组有点不稳定,因为:
- 您无法真正保证不会有多个人具有相同的名称,因为数组不保证唯一的条目。
- 数组不会动态调整大小,因此您必须自己执行此操作。
不过,它仍然可以完成。 下面是一个使用 Java 8 的 Stream API 的示例。
假设您正在寻找具有相同名称和 ID 的Member
。 然后,您将需要过滤掉任何不是该条目的元素,将它们收集到List
,然后将该List
转换为数组。
所以结果将是:
member = Arrays.stream(member)
.filter(m -> removeName.equals(m.getName())
&& removeID.equals(m.getID()))
.collect(Collectors.toList())
.toArray(new Member[0]);