如何在Java中使用扫描仪时删除ArrayList中的特定对象

时间:2019-02-17 14:08:17

标签: java object arraylist java.util.scanner

我正在尝试通过输入(扫描仪)从ArrayList(memberList)中删除MemberPlayer(object)

我曾尝试查看Google和Stack,但似乎找不到使用扫描仪的任何东西。

    public void removeMember(){
    System.out.println("Which MemberPlayer are you looking for?:");
    System.out.print("Input first name: ");
    String fName = input.nextLine().toUpperCase();
    System.out.print("Input last name: ");
    String lName = input.nextLine().toUpperCase();

    for (MemberPlayer m: memberlist){
        if(m.getFirstName().contains(fName) && m.getLastName().contains(lName)) {
            System.out.println();
            System.out.println("This MemberPlayer exist:");
            System.out.println(fName + " " + lName);

            System.out.print("Do you want to remove this MemberPlayer?  [yes/no]");
            input.nextLine().toUpperCase();
            if (input.equals("Yes")) {
                memberlist.remove(); //I can't figure out how to write this line?
            }else{
                break;
            }
        }else {
            System.out.println();
            System.out.println("This MemberPlayer doesn't exist");
            System.out.println();
            break;
        }
    }
}

我从file.txt中读取了具有以下信息的会员列表:名字,姓氏,年龄和球队。

ANDERS
ANDERSEN 23 1

BERT BERSEN 16 2

HANS HANSEN 25 1

TIM TIMSEN 20 2
MORTEN MORTENSEN 34 1

4 个答案:

答案 0 :(得分:0)

您需要使用来自文档的List#remove()

  

布尔值删除(对象o)

     

删除指定的第一次出现   此列表中的元素(如果存在)(可选操作)。如果这   list不包含元素,它保持不变。更正式地说,   删除索引i最低的元素,使得(o == null?   get(i)== null:o.equals(get(i)))(如果存在这样的元素)。退货   如果此列表包含指定的元素,则为true(或者等效地,如果   该列表因通话而更改)。


此外,您在这里不需要public void removeMember() { System.out.println("Which MemberPlayer are you looking for?:"); System.out.print("Input first name: "); String fName = input.nextLine().toUpperCase(); System.out.print("Input last name: "); String lName = input.nextLine().toUpperCase(); // create an object with input received MemberPlayer m = new MemberPlayer(fName, lName); // use contains of List if (memberlist.contains(m)) { memberlist.remove(m); } else { System.out.println("This MemberPlayer doesn't exist"); } } 。您的方法可以简化为更多面向对象的方法:

.equals()

请确保您覆盖.hashcode()中的MemberPlayer和{{1}}方法。

答案 1 :(得分:0)

为此,我建议使用Iterator,因为在迭代时更改对象的状态时,使用List.remove(Object o)会抛出ConcurrentModificationException

所以Iterator.remove()将是一个安全的选择。从 Java SE 1.8 文档:

  

迭代器允许调用者从基础中删除元素   在迭代过程中使用定义明确的语义收集。

因此,使用List直接从List.remove()中删除对象将导致不可预测的迭代,并在迭代时抛出ConcurrentModificationException

如果您不是迭代,那么可以使用List.remove(Object o)List中删除对象。

//Initializes the iterator, checks if next element is present by calling Iterator.hasNext()
for(Iterator<MemberPlayer> itr = memberList.iterator(); itr.hasNext(); ){
         m = itr.next(); //The current element of the List
         if(m.getFirstName().contains(fName) && m.getLastName().contains(lName)) {
            System.out.println();
            System.out.println("This MemberPlayer exist:");
            System.out.println(fName + " " + lName);

            System.out.print("Do you want to remove this MemberPlayer?  [yes/no]");
            input.nextLine().toUpperCase();
            if (input.equals("Yes")) {
                 itr.remove(); //Removes the current element if the condition is satisfied.
            }else{
                 break;
            }
         }else {
             System.out.println();
             System.out.println("This MemberPlayer doesn't exist");
             System.out.println();
             break;
         }
 }

答案 2 :(得分:0)

请记住,在使用Collection<T>循环进行迭代时,不能删除for-each元素。在这种情况下,可能会抛出ConcurrentModificationException

根据用例,您需要显式使用Interator<T>ListIterator<T>
A ListIterator还允许插入元素或设置元素。

for (final Iterator<MemberPlayer> iterator = memberList.iterator(); iterator.hasNext();) {
   final MemberPlayer m = iterator.next();

   if (m.getFirstName().contains(fName) && m.getLastName().contains(lName)) {
      ...

      iterator.remove();
   }
}

答案 3 :(得分:0)

这是经过反复试验后最终为我工作的结果。

public void removeMember()throws FileNotFoundException {
    System.out.println("Which MemberPlayer are you looking to remove?:");
    System.out.print("Input first name: ");
    String fName1 = input.nextLine().toUpperCase();
    System.out.print("Input last name: ");
    String lName2 = input.nextLine().toUpperCase();

    for (MemberPlayer m : memberlist){

        if (m.getFirstName().equals(fName1) & m.getLastName().equals(lName2)) {
            System.out.println();
            memberlist.remove(m);
            System.out.println("You removed: "+m.getFirstName()+" "+m.getLastName());
            System.out.println();
            saveMember();
            break;
        } else {
            System.out.println();
            System.out.println("This MemberPlayer doesn't exist");
            System.out.println();
            break;
        }
    }
}