2

ArrayList<String>のようなディレクトリのパスが含まれています。

/home, /usr...

リストにその要素の親ディレクトリがすでに含まれている場合に、リストからすべてのパスを削除するコードを記述したいと思います。例:リストに次のものが含まれている場合:

/home
/home/games

次に、親の/ homeがすでにリストに含まれているため、/ home/gamesを削除する必要があります。以下はコードです:

for (int i = 0; i < checkedList.size(); i++) {
            File f = new File(checkedList.get(i));
            if(checkedList.contains(f.getParent()));
            checkedList.remove(checkedList.get(i));
}

上記checkedListString arrayListです。

リストに次のものが含まれている場合に問題が発生します

/home
/home/games/minesweeper

親ゲームがリストにないため、マインスイーパフォルダーは削除されません。これらの種類の要素も削除する方法は?

4

5 に答える 5

4

別の可能な解決策は、を使用することString.startsWith(String)です。


Fileただし、もちろん、相対ディレクトリやその他の特殊性を処理するために、クラスの親機能を利用することもできます。ソリューションのドラフトに従います。

List<String> listOfDirectories = new ArrayList<String>();
listOfDirectories.add("/home/user/tmp/test");
listOfDirectories.add("/home/user");
listOfDirectories.add("/tmp");
listOfDirectories.add("/etc/test");
listOfDirectories.add("/etc/another");

List<String> result = new ArrayList<String>();

for (int i = 0; i < listOfDirectories.size(); i++) {
    File current = new File(listOfDirectories.get(i));
    File parent = current;
    while ((parent = parent.getParentFile()) != null) {
        if (listOfDirectories.contains(parent.getAbsolutePath())) {
            current = parent;
        }
    }
    String absolutePath = current.getAbsolutePath();
    if (!result.contains(absolutePath)) {
        result.add(absolutePath);
    }
}

System.out.println(result);

これは印刷されます:

[/home/user, /tmp, /etc/test, /etc/another]
于 2012-07-12T20:49:34.047 に答える
1

文字列を操作して、各文字列のベースディレクトリを取得できます。

int baseIndex = checkedList.get(i).indexOf("/",1);
String baseDirectory = checkedList.get(i).substring(0,baseIndex);
if(baseIndex != -1 && checkedList.contains(baseDirectory))
{
    checkedList.remove(checkedList.get(i));
}

これにより、2番目の「/」のインデックスが取得され、そのスラッシュまで文字列が抽出されます。2番目のスラッシュが存在する場合は、リストにベース文字列が含まれているかどうかを確認し、mtachがある場合は現在の文字列を削除します。

于 2012-07-12T21:03:05.383 に答える
0

文字列からルートを差し引いて、ハッシュセットに追加できます。

例えば:

/ home / gamesがある場合は、文字列の減算や正規表現などを使用して、文字列から「ホーム」を減算できます。

ハッシュセットに「ホーム」を追加する前に、それがすでに追加されているかどうかを確認する必要があります。

     if (hashset.Contains("home"))
             {
                //then it s already added
              }

    else

     {
           hashhset.add("home");
     }
于 2012-07-12T20:55:09.903 に答える
0

各リストアイテムのすべての親を順番にチェックする必要があります。

リストに正規化された絶対パスFileオブジェクトが含まれていると仮定します。

for (int i = 0; i < checkedList.size(); i++) {
    File curItem = checkedList.get(i);
    for (
        File curParent = curItem.getParent( );
        curParent != null;
        curParent = curParent.getParent( )
    )
    {
        if(checkedList.contains( curParent ) )
        {
            checkedList.remove( curItem );
            break;
        }
    }
}

実は書き直しますListIterator

for (ListIterator iter = checkedList.iterator(); iter.hasNext(); )
{
    File curItem = iter.next();
    for (
        File curParent = curItem.getParent( );
        curParent != null;
        curParent = curParent.getParent( )
    )
    {
        if(checkedList.contains( curParent ) )
        {
            iter.remove( );
            break;
        }
    }
}
于 2012-07-12T21:01:06.500 に答える
0

反対の仕事をしますか?親がArrayListに見つからない場合は、値を最終出力ArrayListに追加しますか?

for (int i = 0; i < checkedList.size(); i++) {
            File f = new File(checkedList.get(i));
            if(!checkedList.contains(f.getParent()));
            yourOutputList.Add(checkedList.get(i));
}
于 2012-07-12T21:04:34.133 に答える