如何获取列表的下一个树元素

时间:2015-05-24 13:38:32

标签: java for-loop iteration

这个问题更多地是关于最佳做法,而不是从列表中提取元素。

我有一个ArrayList,我通过使用一个简单的for循环来实现它。如果显示某个关键字,我需要将下一个树元素与特定模式进行比较。

private static boolean areVectorArgumentsValid(ArrayList<String> fileContent)
{
    for (int i=0; i<fileContent.size(); i++)
    {
        if (fileContent.get(i).equals(NORMAL) || fileContent.get(i).equals(VERTEX))
        {
            // get the next three elements of "fileContent" and see if they match a certain pattern
        }
    }
return true;
}

我的第一种方法是在实际的outler循环中使用另一个for循环,然后将i递增3:

for (int j=i+1; j<=i+3; j++)
{
    if (!fileContent.get(j).matches(PATTERN))
    {
        return false;
    }
}
i+=3;

正如你所看到的,让方法做我想做的事并不难,但是......我不确定是否有一种你可以称之为更优雅的方式

4 个答案:

答案 0 :(得分:1)

  

这个问题更多地是关于最佳实践,而不是关于获取元素   从列表中。

在详细介绍之前几点评论..

  • NORMAL.equals(fileContent.get(i))代替fileContent.get(i).equals(NORMAL)将避免NullPointerException
  • 在迭代接下来的三个元素之前,您应首先检查您的List是否有下三个元素,以避免ArrayIndexOutOfBoundException

现在如果它仅仅检查接下来的三个元素,并且只有当三个元素中的任何一个与模式不匹配时才返回false,而不是像下面那样,

   if (fileContent.size() < i + 3 
    && (!fileContent.get(i+1).matches(PATTERN)
        || !fileContent.get(i+2).matches(PATTERN) 
        || !fileContent.get(i+3).matches(PATTERN))) {
        return false;
   }

问题 在这种方法中,它不会检查您的列表是否没有下三个元素。

至于您通过检查下一个可用元素的方法,您可以在调用{{{}>之前添加一个条件来检查您的列表是否包含 循环 中的下一个元素列表中的方法。你迭代下三个元素的方法似乎很好,但需要改进。

get

答案 1 :(得分:0)

您可以重复三次并在获取元素时使用++i

for (int j = 0; j < 3; j++) {
    if (!fileContent.get(++i).matches(PATTERN)) {
        return false;
    }
}

或者用stream做这样的事情:

if (fileContent.stream().skip(i).limit(3).anyMatch(s -> !s.matches(PATTERN))) {
    return false;
}
i += 3;

但我认为最好的解决方案是彻底改变它并使用Iterator

private static boolean areVectorArgumentsValid(ArrayList<String> fileContent) {
    for (Iterator<String> it = fileContent.iterator(); it.hasNext();) {
        String s = it.next();
        if (!s.equals(NORMAL) && !s.equals(VERTEX)) {
            continue;
        }
        for (int i = 0; i < 3; i++) {
            if (!it.hasNext() || !it.next().matches(PATTERN)) {
                return false;
            }
        }
    }
    return true;
}

答案 2 :(得分:0)

在我看来,你应该创建一个方法,它从数组和索引开始查找,如果匹配三个或不匹配则返回boolean。这是优雅的方式。

答案 3 :(得分:0)

通过引入状态,您只需一个循环即可完成:

private static boolean areVectorArgumentsValid(ArrayList<String> fileContent)
{
    int state = 0;
    for (int i=0; i<fileContent.size(); i++)
    {
         switch (state) {
         case 0:
             if (fileContent.get(i).equals(NORMAL) || fileContent.get(i).equals(VERTEX))
                 state++;
             break;
         case 1:
         case 2:
         case 3:
             if (!fileContent.get(i).matches(PATTERN))
                 return false;
             state = (state + 1) % 4;
             break;
    }
    return true;
}