android - 比较两个非常大的 ArrayList,其中一个是从 firebase 检索到的

Posted

技术标签:

【中文标题】android - 比较两个非常大的 ArrayList,其中一个是从 firebase 检索到的【英文标题】:android - Comparing two very large ArrayLists one of them retrieved from firebase 【发布时间】:2020-04-29 15:54:42 【问题描述】:

所以现在我正在尝试显示仅存在于 firebase 数据库“用户”表中的联系人,

所以第一步是获取我所有的联系人(在不到一秒的时间内完美完成) 第二个是检索我数据库中的所有用户,只是为了比较两个 Arraylist 以检查我的任何联系人是否存在于数据库中,如果存在则显示它们(实际上是这种情况)

我已经这样做了,但我 100% 确定这是一个太慢的算法! ,

如果数据库中有 200 万个用户,而我有 1000 个联系人,那么 1000 * 2,000,000 !!显示我唯一存在于 firebase 数据库中的联系人将需要很长时间,

有什么解决办法吗?

这是我的代码

      `
       // this means it will load the whole users from database !
        DatabaseReference  databaseReference = FirebaseDatabase.getInstance().getReference("Users");
        databaseReference.addValueEventListener(new ValueEventListener() 
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) 

                contactsList.clear();

                // this algorithm means that if there is one million records it will loop through 
                 //all of them
                // then add all of them to the list
                // takes lots of time actually :(



                for(DataSnapshot snapshot : dataSnapshot.getChildren())
                    User user  = snapshot.getValue(User.class);

                    for(Contacts contacts : PhonecontactsList)
                        // if this user phone eqauals the phone we saved in the phone array list
                        if(user.getPhone().equals(contacts.getPhone()))
                            // if the user doesn't exist in the list
                            if (!contactsList.contains(user)) 
                                // add them
                                contactsList.add(new User(
                                        user.getId(),
                                        contacts.getUsername(),
                                        user.imageURL,
                                        user.getStatus(),
                                        user.getPhone(),
                                        user.getTyping_to(),
                                        user.getSearch(),
                                        user.getTimestamp()

                                ));
                            


                        
                    


                

                UsersAdapter usersAdapter = new UsersAdapter(getContext(), contactsList  , false);
                contactsRecycler.setAdapter(usersAdapter);
            
            @Override
            public void onCancelled(DatabaseError databaseError) 

            
        );

`

提前致谢!

【问题讨论】:

【参考方案1】:

从 Firebase 实时数据库等云托管数据库中获取全部 100 万条记录是一个非常糟糕的主意。通过移动连接传输所有这些记录是不可能的。最终用户还可能会花费大量的数据配额来获得整套数据。

如果您只需要知道哪些数据库记录在您的本地数据集中,只需对本地数据集中的每个项目进行一次请求,并显示存在的那些。您可以忽略其他所有内容。

【讨论】:

以上是关于android - 比较两个非常大的 ArrayList,其中一个是从 firebase 检索到的的主要内容,如果未能解决你的问题,请参考以下文章

匹配两个具有容差的非常大的向量(快速!但节省工作空间)

android通知详解

如何使用 Python 比较 2 个非常大的矩阵

比较三个非常大的数组并创建一个新对象

需要在 python 中比较 1.5GB 左右的非常大的文件

需要在 python 中比较 1.5GB 左右的非常大的文件