我有一个场景,其中我有一个方法以 Arraylist 的形式获取结果,如下图所示。
因此,作为对图片的简要说明,我将获得结果 1作为第一块对象,然后我将获得实际包含结果 1和一组新对象的结果 2,然后继续。
注意:所有这些对象块都将包含重复项。所以我将不得不过滤掉它。
我的目标是从这些块中创建一个列表而没有任何重复,并且只有一个来自家庭的对象(这些对象的一个特殊字符)。
请找到当前的代码片段,在我得到一大块结果时调用的同步方法中使用,我用它来实现这个:
在每次结果更新时,将使用结果 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 作为键的原因。