0

私のプログラムは、何千もの 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());
4

3 に答える 3

0

Petr Mensik の回答から構築すると、実装する必要がequalsありhashCodeます。そこから、アイテムをマップに配置できます。重複に遭遇した場合は、何をすべきかを決めることができます:

Map<String, PLSQLItemStore> storeMap = new HashMap<String, PLSQLItemStore>();
for(PLSQLItemStore currentStore : storedList) {

    // See if an item exists in the map with this name
    PLSQLItemStore buffStore = storeMap.get(currentStore.getName();

    // If this value was never in the map, put it in the map and move on
    if(buffStore == null) {
        storeMap.put(currentStore.getName(), currentStore);
        continue;
    }

    // If we've gotten here, then something is in buffStore.
    // If buffStore is newer, put it in the map.  Otherwise, do nothing
    // (this might be backwards --  I didn't quite follow your logic.  
    // Feel free to correct me
    if(buffStore.getLastModified() > currentStore.getLastModified())
        storeMap.put(currentStore.getName(), currentStore);

}

あなたの地図は複製されません。Mapは であるためCollection、後でコード内で反復処理できます。

for(PLSQLItemStore currentStore : storeMap) {
    // Do whatever you want with your items
}
于 2013-11-12T15:45:12.020 に答える
0

PLSQLItemStore実装hashCodeとメソッドを作成する必要があり、重複を削除するためにequals使用できます。Set

public class PLSQLItemStore {

    private String name;   

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 47 * hash + (this.name != null ? this.name.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final PLSQLItemStore other = (PLSQLItemStore) obj;
        if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name))     {
            return false;
        }
        return true;
    }
}

そして、ただやるSet<PLSQLItemStore> withoutDups = new HashSet<>(storedList);

PSequalsでありhashCode、NetBeans IDE によって生成されます。

于 2013-11-12T15:03:57.203 に答える
0

それらをグアバに入れてくださいArrayListMultimap<String,PLSQLItemStore>

PLSQLItemStoreキーとしてそれぞれを使用して追加nameします。

追加が完了したら、マルチマップをループし、それぞれListComparator<PLSQLItemStore>which でソートしdateLastModified、それぞれの最後のエントリを引き出しますList- それは最新のものになりますPLSQLItemStore

これらのエントリを別のものMap<String,PLSQLItemStore>(またはList<PLSQLItemStore>、名前を気にしなくなった場合) に入れて、. を破棄しArrayListMultimapます。

于 2013-11-12T15:41:47.627 に答える