在ArrayList中,如果子目录已存在于列表中,如何删除子目录?

时间:2012-07-12 20:48:04

标签: java arraylist

我有ArrayList<String>包含directiories的路径,例如:

/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

现在扫雷文件夹不会被删除,因为其父游戏不在列表中。如何删除这些元素?

5 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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则删除当前字符串。

答案 2 :(得分:0)

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

例如:

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

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

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

    else

     {
           hashhset.add("home");
     }

答案 3 :(得分: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;
        }
    }
}

答案 4 :(得分: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));
}