私のプログラムは、何千もの PL/SQL 関数、プロシージャ、およびビューを取り込み、それらをオブジェクトとして保存してから、配列リストに追加します。私の配列リストには、次の形式でオブジェクトが格納されます。
ArrayList<PLSQLItemStore> storedList = new ArrayList<>();
storedList.add(new PLSQLItemStore(String, String, String, Long ));
storedList.add(new PLSQLItemStore(Name, Type, FileName, DatelastModified));
私がやりたかったのは、名前に基づいて配列リストから重複オブジェクトを削除することです。古いオブジェクトは、dateLastModified 変数に基づいて削除されます。私が取ったアプローチは、外側のループと内側のループを持ち、各オブジェクトを他のすべてのオブジェクトと比較し、古いと見なされた場合は名前を「削除」に変更することでした。次に、プログラムは配列リストを逆方向に 1 回最終パスし、名前が「remove」に設定されているオブジェクトをすべて削除します。これはうまく機能しますが、非常に非効率的です。1000 個のオブジェクトは、1,000,000 回のパスを作成する必要があることを意味します。誰かがそれをより効率的にするのを手伝ってくれるかどうか疑問に思っていましたか? ありがとう。
サンプル入力:
storedList.add(new PLSQLItemStore("a", "function", "players.sql", 1234));
storedList.add(new PLSQLItemStore("a", "function", "team.sql", 2345));
storedList.add(new PLSQLItemStore("b", "function", "toon.sql", 1111));
storedList.add(new PLSQLItemStore("c", "function", "toon.sql", 2222));
storedList.add(new PLSQLItemStore("c", "function", "toon.sql", 1243));
storedList.add(new PLSQLItemStore("d", "function", "toon.sql", 3333));
ArrayList イテレータ:
for(int i = 0; i < storedList.size();i++)
{
for(int k = 0; k < storedList.size();k++)
{
if (storedList.get(i).getName().equalsIgnoreCase("remove"))
{
System.out.println("This was already removed");
break;
}
if (storedList.get(i).getName().equalsIgnoreCase(storedList.get(k).getName()) && // checks to see if it is valid to be removed
!storedList.get(k).getName().equalsIgnoreCase("remove") &&
i != k )
{
if(storedList.get(i).getLastModified() >= storedList.get(k).getLastModified())
{
storedList.get(k).setName("remove");
System.out.println("Set To Remove");
}
else
{
System.out.println("Not Older");
}
}
}
}
オブジェクトを削除する最終パス:
System.out.println("size: " + storedList.size());
for (int i= storedList.size() - 1; i >= 0; i--)
{
if (storedList.get(i).getName().equalsIgnoreCase("remove"))
{
System.out.println("removed: " + storedList.get(i).getName());
storedList.remove(i);
}
}
System.out.println("size: " + storedList.size());