【问题标题】:Remove element of arraylist from user's input从用户的输入中删除 arraylist 的元素
【发布时间】:2017-01-11 14:29:29
【问题描述】:

我需要使用用户输入从ArrayList 中删除一个元素。 并不是真正寻求解决方案,而是更多地寻求正确方向的指导。

public class BFFHelper 
{
    ArrayList<BestFriends> myBFFs;
    Scanner keyboard = new Scanner(System.in);

    public BFFHelper()
    {
        myBFFs = new ArrayList<BestFriends>();
    }

    public void addABFF()
    {
        System.out.println("Enter a first name: ");
        String firstName = keyboard.next();
        System.out.println("Enter a last name: ");
        String lastName = keyboard.next();
        System.out.println("Enter a nick name: ");
        String nickName = keyboard.next();
        System.out.println("Enter a phone number: ");
        String cellPhone = keyboard.next();
        BestFriends aBFF = new BestFriends(firstName, lastName, nickName, cellPhone);
        myBFFs.add(aBFF);            
    }

    public void changeABFF()
    {
        System.out.println("I am in changeBFF");
    }

    public void removeABFF()
    {
        //System.out.println("I am in removeABFF");
        System.out.print("Enter friend's name to remove: ");

        int i = 0;
        boolean found = false;

        while (i<myBFFs.size() && !found)
        {
            if (myBFFs.get(1).getfirstName().equalsIgnoreCase(firstName)) && (myBFFs.get(1).hetlastName().equalsIgnoreCase(lastName))                   
                i++
        }        
    }

    public void displayABFF()
    {
        System.out.println("My Best Friends Phonebook is: ");
        System.out.println(myBFFs);
    }            
}

这就是我的主要课程

public class BestFriends {

    private static int friendNumber = 0;
    private int friendIdNumber;
    private String firstName;
    private String lastName;
    private String nickName;
    private String cellPhoneNumber;


    public BestFriends (String aFirstName, String aLastName, String aNickName, String aCellPhone)
    {
        firstName = aFirstName;
        lastName = aLastName;
        nickName = aNickName;
        cellPhoneNumber = aCellPhone;
        friendIdNumber = ++friendNumber;   
    }

    public String getFirstName()
    {
        return firstName;
    }

    public String getLastName()
    {
        return lastName;
    }

    public String getNickName()
    {
        return nickName;
    }

    public String getCellPhone()
    {
        return cellPhoneNumber;
    }

    public int getFriendId()
    {
        return friendIdNumber;
    }

    public String toString()
    {
        return friendIdNumber + ". " + firstName + " (" + nickName + ") " +  lastName + "\n" + cellPhoneNumber + "\n";
    }
}

【问题讨论】:

  • 你知道如何获取用户输入吗?或者您是否坚持删除元素的逻辑?
  • 命名提示:如果一个类被称为 BestFriends;我希望它以某种方式处理“复数”;就像了解两个最好的朋友一样。但看起来你的班级只知道一个简单的人(有一些 id)。所以,这里有一些误解——要么你的班级有错误的名字;要么或者它的内容根本不反映它的名字!
  • 提示:覆盖BestFriends中的equalshashCode方法,你就可以使用List::remove删除它。

标签: java arrays arraylist while-loop element


【解决方案1】:

可以通过多种方式从 ArrayList 中删除元素,例如通过调用list.remove(index);或者,只需指定object to remove

只需研究这些方法的 Javadoc。除此之外,还有诸如 removeAll() 之类的调用会删除 所有 提供给调用的参数。

附注:至少您的代码中有一个错误:

if (myBFFs.get(1).getfirstName().equalsIgnoreCase(firstName)) && (myBFFs.get(1).hetlastName().equalsIgnoreCase(lastName))                   

应该读一下。

if (myBFFs.get(i).getfirstName().equalsIgnoreCase(firstName)) && (myBFFs.get(i).hetlastName().equalsIgnoreCase(lastName))                   

假设您出于某种原因使用 i 循环;并且您不想一直将 element1 与自身进行比较。

当我们这样做的时候:你可以改进你的抽象。显然,您的程序是关于“人类”的。人类通常有固定的名字,不是吗。含义:有一个只代表一个人的类; final 字段用于显示无法更改的信息。这些字段通过构造函数初始化;而且你没有任何设置器。

【讨论】:

    【解决方案2】:

    如何从用户输入中删除ArrayList的元素?

    一种方法是使用Iterator 并在找到匹配项时调用remove(),如下所示:

    // Iterate over the list myBFFs
    for (Iterator<BestFriends> it = myBFFs.iterator(); it.hasNext();) {
        BestFriends bf = it.next();
        if (/*some test here*/) {
            // Found a match to remove
            it.remove();
            // Exit from the loop
            // To be added if and only if you expect only one match otherwise keep iterating
            break;
        }
    }
    

    假设您使用 Java 8,您可以依赖 Stream API 来满足此类需求。

    如果您想删除第一个匹配项

    myBFFs.stream().filter(bf -> /*some test here*/).findFirst().ifPresent(myBFFs::remove);
    

    此方法使用List#remove(Object o) 删除唯一对象。

    如果您想删除所有匹配项

     myBFFs.removeAll(
         myBFFs.stream().filter(bf -> /*some test here*/).collect(Collectors.toList())
     );
    

    此方法使用List#removeAll(Collection c) 删除对象集合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      相关资源
      最近更新 更多