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

时间:2013-08-09 10:54:07

标签: java arraylist hashmap

我有一个场景,我有一个方法可以将结果作为Arraylist以如下图所示的形式获得。

enter image description here

所以,作为对图片的简要解释,我将结果1 作为第一块对象,然后我将获得结果2 ,其实际包含< strong>结果1 和一组新对象,然后继续。

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

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

请找到当前的代码片段,在我得到一块结果时调用的synchronized方法中使用,我用它来实现这个:

在每次结果更新时,将使用结果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检查重复项和同一系列。

请在代码中查看我的内联注释,因此,我想获得一些指导,以提高我对此过程的性能。


更新

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

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

1 个答案:

答案 0 :(得分:0)

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

首先,Set正是您所需要的:

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

每当您获得新的结果列表时:

set.addAll(list);

如果你真的需要一个List:

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