下の図に示すような形式で Arraylist として結果を取得するメソッドがあるシナリオがあります。
図の簡単な説明として、オブジェクトの最初のチャンクとして結果 1を取得し、実際に結果 1と新しいオブジェクトのセットを 含む結果2を取得します。これが続きます。
注: これらのオブジェクトのチャンクにはすべて重複が含まれます。したがって、これを除外する必要があります。
私の目的は、重複を持たずにこれらのチャンクから単一のリストを作成し、ファミリからオブジェクトを 1 つだけ持つことです (これらのオブジェクトの 1 つの特殊文字)。
これを実装するために使用している、結果のチャンクを取得するたびに呼び出す同期メソッドで使用される現在のコード スニペットを見つけてください。
結果が更新されるたびに、このメソッドは結果の 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
}
理論的には、次に受け取る結果のデルタ オブジェクトのみを解析する必要があります。そこで、arrayList の removeAll メソッドを使用し、hashMap を使用して重複と同じファミリをチェックしました。
コード内のインライン コメントを参照してください。そのため、このプロセスのパフォーマンスを改善するための指針をいくつか取得したいと考えています。
更新:
これらのオブジェクトの特殊な特徴は、一連のオブジェクトが同じファミリ (ID) に属することができるため、各ファミリから 1 つのオブジェクトのみが最終リストに存在する必要があることです。
これが、hashMap を使用して familyID をキーにした理由です。