如何使用用户输入从数组中删除对象



有人可以告诉我如何从数组中删除对象吗?但这里有一个问题(对我来说很好),数组是这样的

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]);

相关内容

  • 没有找到相关文章