如何提高以同步方式处理多个 Arraylist 请求的性能,以将它们创建为没有重复的最终列表

Posted

技术标签:

【中文标题】如何提高以同步方式处理多个 Arraylist 请求的性能,以将它们创建为没有重复的最终列表【英文标题】:How to improve the performance of processing multiple Arraylist request in a synchronized way to create them into a final list with no duplicates 【发布时间】:2013-08-11 06:58:46 【问题描述】:

我有一个场景,其中我有一个方法以 Arraylist 的形式获取结果,如下图所示。

所以,作为对图片的简要说明,我将获得 Result 1 作为第一块对象,然后我将获得 Result 2 实际上包含 结果 1 和一组新对象,然后继续。

注意:所有这些对象块都将包含重复项。所以我将不得不过滤掉它。

我的目标是从这些块中创建一个单独的列表而没有任何重复,并且只有一个来自一个家庭的对象(这些对象的一个​​特殊字符)。

请找到当前代码 sn-p,在我得到一大块结果时调用的同步方法中使用,我用它来实现这个:

在每次结果更新时,将使用结果 arrayList 调用此方法。

private synchronized void processRequestResult(QueryResult result)
        
        ArrayList currArrayList = result.getResultsList();
        ArrayList tempArrayList = result.getResultsList();

        /**
         * Remove all elements in prevArrayList from currArrayList
         * 
         * As per the javadocs, this would take each record of currArrayList and compare with each record of prevArrayList, 
         * and if it finds both equal, it will remove the record from currArrayList
         * 
         * The problem is that its easily of n square complexity.
         */
        currArrayList.removeAll(prevArrayList);

        // Clone and keep the currList for dealing with next List 
        prevArrayList = (ArrayList) tempArrayList.clone();


        for (int i = 0; i < currArrayList.size(); i++)
        
            Object resultObject = currArrayList.get(i);

            // Check for if it reached the max of items to be displayed in the list.
            if (hashMap.size() >= MAX_RESULT_LIMIT)
            
                //Stop my requests
                //Launch Message
                break;
            

            //To check if of the same family or duplicate
            if (resultObject instanceof X)
            
                final Integer key = Integer.valueOf(resultObject.familyID);
                hashMap.put(key, (X)myObject);
            
            else if (resultObject instanceof Y)
            
                final Integer key = Integer.valueOf(resultObject.familyID);
                hashMap.put(key, (Y)myObject);
            
        

        // Convert the HashSet to arrayList
        allResultsList = new ArrayList(hashMap.values());

        //Update the change to screen
  

理论上,我应该只尝试在接下来收到的结果中解析 delta 对象。所以我选择了arrayList 的removeAll 方法,然后使用hashMap 检查重复项和同一系列。

请在代码中查看我的内联 cmets,因此,我想获得一些指针来提高我在此过程中的性能。


更新

这些对象的特殊之处在于,一组对象可以属于同一个家族(一个 ID),因此每个家族中只有一个对象应该出现在最终列表中。

所以这就是我使用 hashMap 并将 familyID 作为键的原因。

【问题讨论】:

这只是从一系列列表中消除重复项以创建一个列表吗?保持秩序重要吗? 如果我理解正确,不需要保留顺序。 “没有重复的单个列表”,尝试衡量将其全部转储到哈希集中的性能?我怀疑比 N^2 更好 我不明白图表的相关性,或者代码 @Bohemian:该图的相关性在于表明后续结果列表将包含所有元素,这些元素按之前收到的结果列表的某种顺序排列。增量是两个相邻结果列表之间的唯一变化。增量列表中也可能有重复项。请说明你不明白的部分。 【参考方案1】:

我不理解图表或代码,但我假设要求是创建一个唯一元素列表。

首先,你确实需要一个 Set:

Set<MyClass> set = new HashSet<MyClass>();

每次获得新的结果列表时:

set.addAll(list);

如果你真的需要一个列表:

List<MyClass> list = new ArrayList<MyClass>(set);

【讨论】:

我更新了我的问题,提供了有关对象的更多详细信息。这就是我选择 HashMap 而实际上不能使用 HashSet 的原因,因为我认为我们不能覆盖 hashSet 的等号。

以上是关于如何提高以同步方式处理多个 Arraylist 请求的性能,以将它们创建为没有重复的最终列表的主要内容,如果未能解决你的问题,请参考以下文章

jquery ajax请求方式与提示用户正在处理请稍等,等待数据返回时loading的显示

系统架构中的同步概念:一张图看到这两个模式集成,处理访问同步

Java基础知识笔记(五:多线程的同步问题)

Vector(同步)和ArrayList(异步)异同

如何以同步方式从 JS 调用 C++ 方法(QtWebEngine)

Vector(同步)和ArrayList(异步)异同