2

我有一个ArrayList<String>包含目录的路径,例如:

/home, /usr...

如果列表已经包含该元素的父目录,我想编写一个代码,该代码将从列表中删除所有路径。例如:如果列表包含:

/home
/home/games

然后, /home/games 应该被删除,因为它的父 /home 已经在列表中。下面是代码:

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));
}

上面checkedList是一个String 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));
}

这将获得第二个'/'的索引并提取字符串直到那个斜线。如果第二个斜杠存在,则检查列表是否包含基本字符串,如果存在 mtach,则删除当前字符串。

于 2012-07-12T21:03:05.383 回答
0

您可以从字符串中减去根并将其添加到哈希集中。

例如:

如果你有 /home/games 你可以使用字符串减法或正则表达式或任何你想要的东西从字符串中减去“home”。

在将“home”添加到哈希集之前,您必须检查它是否已经添加:

     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 回答