1

これについていくつかの投稿を読みましたが、探しているものを正確に取得できません。このための複雑なロジックを開発する方法を知っています。これは Android 用であり、利用可能なリソースが限られているため、デバイスでの処理が多すぎることは期待できません。

次のように、5 つのフィールドで構成される Bean クラス オブジェクトの ArrayList があります。

Java Bean -- MyShares

  1. ファイル名
  2. ファイルパス
  3. ファイルサイズ
  4. 共有されている
  5. クリエイター

ファイルパスのみを含む String の別の ArrayList があります。今私が望むのは、2 つの arraylist の間のすべての共通要素を削除することです。これは、数秒でファイル パス arraylist と最初の arraylist オブジェクトのファイル パスが類似していることを意味し、両方の arraylist から削除する必要がありますが、新しい arraylist は必要ありません珍しい要素が含まれています。しかし、共通の要素なしで両方の配列リストのみを取得したいと考えています。

4

4 に答える 4

2

私はあなたのためにいくつかの手がかりを持って行きます

1 つは Bean オブジェクト、つまりmyBeans用で、もう 1 つは filePaths、つまりfilePaths用の2 つのリストがあるとします。

List<MyBean> beansToRemove = new ArrayList<MyBean>();
List<FilePath> filePathsToRemove = new ArrayList<FilePath>();

for(Bean myBean : myBeans) {
    for(FilePath filePath : filePaths) {
        if(myBean.getfilePath.equals(filePath.getFilePath())) {
            beansToRemove.add(myBean);
            filePathsToRemove.add(filePath);
        }
    }
}

//Now remove filePaths and beans if any

for(Bean myBean : beansToRemove) {
    myBeans.remove(myBean);
}

for(FilePath filePath : filePathsToRemove) {
    filePaths.remove(filePath);
}

何をすべきかを明確にするための流れです。必要に応じてさらにカスタマイズできます。

于 2013-04-11T13:29:57.330 に答える
2

MapfromStringをオブジェクト タイプに使用できます( ObjSSCCE を作成するために使用しました)。

listobjectsとlist が与えられたとしますstrings

手順:

  1. 変数をキーとしてすべてobjectsを amapに入れるstr
  2. を使用してこれらすべてのstr変数を取得しますmap.keySet()
  3. objects入っているが入っていないすべての文字列を取得stringsするkeys.removeAll(strings)
  4. strings入っているが入っていないすべての文字列を取得objectsするstrings.removeAll(keys)
  5. objects残りに対応する を取得しますkeys

コレクションの 1 つをバックアップする必要があるため、手順 3 と 4 では注意が必要です。

import java.util.*;

public class Test { 
    public static void main(String[] args) throws Exception {
        new Test();
    }

    public Test() {
        List<Obj> objects = new ArrayList<>();
        objects.add(new Obj("a"));
        objects.add(new Obj("b"));
        objects.add(new Obj("c"));

        List<String> strings = new ArrayList<>();
        strings.add("a");
        strings.add("d");
        strings.add("e");

        remove(objects, strings);

        System.out.println(objects);
        System.out.println(strings);
    }

    public void remove(List<Obj> objects, List<String> strings) {
        Map<String, Obj> map = new HashMap<>();
        for (Obj object : objects) {
            map.put(object.str, object);
        }

        Set<String> keys = map.keySet();
        List<String> oldStrings = new ArrayList<>(strings);

        strings.removeAll(keys);
        keys.removeAll(oldStrings);

        objects.clear();
        for (String key: keys) {
            objects.add(map.get(key));
        }       
    }

    public class Obj {  
        public String str;
        public Obj(String str) {
            this.str = str;
        }
        @Override
        public String toString() {
            return str;
        }       
    }
}

版画:

[b, c]
[d, e]
于 2013-04-11T13:14:42.967 に答える
1

外側のループを使用して Bean オブジェクトをスキャンし、内側のループを使用してファイル パスをスキャンできます。

擬似コード:

for (Bean i in beans) {
    for (String p in paths) {
        if (i.path.equals(p)) {
            beansToRemove.add(i);
            pathsToRemove.add(p);
        }
    }
}
beans.removeAll(beansToRemove);
paths.removeAll(pathsToRemove);

元の配列が残っているため、削除された配列リストを追跡するための追加の配列リストが質問に反するかどうかはわかりません。パス上の両方の配列を事前に並べ替えて、各領域の位置を追跡すると (網羅的な検索ではありません)、n2 から nlgn に改善できます。

于 2013-04-11T13:07:41.573 に答える