【问题标题】:Custom method for ArrayList of custom object自定义对象的ArrayList的自定义方法
【发布时间】:2015-06-17 02:30:40
【问题描述】:

有点两部分的问题。

第一部分:

我有一个自定义类联系人,其中包含字符串:电子邮件、姓名、地址、电话号码。请注意,不同的联系人可能有相同的电子邮件。

{dup@mail.com, Chris Cross, XXX, 122334455}
{dup@mail.com, Christian Cross, YYY, 2233445566}

我希望能够通过ArrayList<Contact> 并根据找到的电子邮件列表删除联系人ArrayList<String>

所以,在某些时候我发现自己想写这个:

for(String email : registeredEmails){
    while(contacts.contains(email)) {    // custom implementation of contains for ArrayList<Contact>
        Contact c = contacts.findContactByMail(email)  // custom method for ArrayList<Contact>
        contacts.remove(c);
    }
}

但无论我在哪里看,压倒性的建议似乎都反对这种完全合理的结构。 我意识到还有其他不依赖于创建 findContactByEmail 的方法,但这种方式更具可读性。

感觉不错!那我可以这样做吗?它不会破坏任何东西是吗?除了关于组合优于继承的抽象辩论之外,还有什么理由我不应该这样做?

第二部分: 我该怎么做?我是 ArrayList 的子类吗?那我最后不是得到一个 MyArrayList&lt;Contact&gt; 吗?不是我想要的样子……

contains 和 findContactByEmail 代码是否在我的 Contact 类中某处或何处?

编辑 这里可能需要一些背景知识。 这是在 Android 应用中。

这一切都发生在应用程序的“朋友”部分。基本上,我得到一个电话联系人列表,用户可以检查这些联系人以发送邀请。

但是,如果此人已经安装了应用,则发送邀请是没有意义的。因此,我根据已安装用户列表检查电话列表。然后回到手机上(在 android 应用程序中),我想在显示之前从电话簿列表中删除这些已安装的用户(他们进入不同的“添加朋友”列表)。 我现在用一个迭代器来实现它,但我的第一反应是为 ArrayList&lt;Contact&gt; 使用自定义方法“findContactByEmail”,并覆盖包含与字符串电子邮件匹配的内容。

【问题讨论】:

  • 在扩展 Arraylist 并拥有自己的新方法时,我没有看到任何问题。一旦你创建了自己的数组列表类,你总是可以有一个 MyArrayList. 的实例,但我建议你也有一个 DB 查询调用。看看这个问题,我不确定该列表是从数据库调用中获取的还是在运行时生成的。
  • 我真的不想要 MyArrayList,我想使用 ArrayList 和额外的方法 findContactByEmail。这是在 Android 应用程序中。我从电话中获取联系人列表,并在服务器上查找已安装用户的数据库。我想在显示之前整理一下联系人列表。
  • @grooble 您正在尝试使您的代码更具可读性,我明白了。我的意思是尝试创建ArrayList 的子类以达到预期效果是不可维护的。相反,让 Java 类保持原样并在您的 Contact 类中创建实用程序类或具有相关功能,以使您的工作更简单。
  • 只需在某处创建一个静态findContactByEmail(List&lt;Contact&gt;, String) 方法和一个静态containsContactWithEmail(List&lt;Contact&gt;, String)...

标签: java android oop arraylist subclass


【解决方案1】:

我发现您的方法难以维护,尤其是从其他开发人员维护您的代码的角度来看。

哦,另外,List 接口已经包含了contains 方法,那为什么还要创建一个新方法呢?

您可以采用 2 种方法:创建一个处理您的电子邮件列表的实用程序类,例如,

public class Contacts {

    private Contacts() {
    }

    public static void removeEmails(List<String> emails, String emailAddressToRemove) {
        //Implementation here...
    }
}

或者,如果您使用的是 Java 8,则可以使用谓词函数并根据谓词进行删除。

这样,您就不会创建自定义 ArrayList 子类。此外,各种框架返回一个集合,并且通过返回您的自定义 ArrayList 并不能保证其他人可能会将其子类化为您的自定义 ArrayList 以使用您的特定方法。

包含和 findContactByEmail 代码是否进入我的联系人类 某处或何处?

我几乎会把它放在我的联系人类中,因为它与联系人信息相关。

【讨论】:

  • 我不明白为什么要写这样的方法,我们可以简单地将电子邮件传递到数据库并删除。只需遍历电子邮件列表,如果存在于数据库中,只需删除或获取或做任何你想做的事情。
  • OP 正在从手机中获取联系人,如果数据库中不存在,则将其从列表中删除,而不是相反。
  • 如果我们只选择需要的那些,而不是获取所有并删除列表。
  • 我不知道他用的是哪个数据库,一般我们会 select * from contacts -- 假设这里的contacts是表名可以用select * from contacts where email not in ('a ','b') -- 其中 a & b 是我们需要删除的电子邮件。
  • 感谢您的 cmets。有关我正在尝试实现的内容的更多说明,请参阅上面的编辑。
【解决方案2】:

在我看来,您想删除所有安装了该应用程序的联系人,并邀请其他人。您可能还想添加新联系人。为此,我们可以有 3 种方法,

  1. 删除已安装应用程序的联系人,为此您可以将列表发送到数据库并删除联系人--从电子邮件所在的联系人中删除 ('a',b ')

  2. 邀请人们安装 - 为此,您可以将(联系人)列表作为参数传递给方法,该方法将迭代并向每个联系人发送单独的请求

  3. 添加新联系人 - 这应该很简单

我没有发现任何问题。

【讨论】:

  • 是的,这一切都已实现。我的问题是关于如何为自定义类覆盖和 ArrayList 方法,以及如何为 ArrayList(不是 MyArrayList)添加另一个自定义方法 findContactByEmail,以便我可以调用:Contact c = contacts.findContactByEmail(email)。还没有人回答。
  • 您能否解释一下,您希望从以下行 Contact c = contacts.findContactByEmail(email) 的输出是什么。
  • 为什么这很重要?我想从contacts.findContactByEmail 中取回一个联系人。
  • 谁安装了应用(在数据库中)或所有联系人(在电话簿中)
猜你喜欢
  • 1970-01-01
  • 2012-01-09
  • 2010-10-19
  • 2013-03-02
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
相关资源
最近更新 更多