如何获取列表的下一个树元素
How to get the next tree elements of a list
这个问题更多的是关于最佳实践,而不是关于从列表中获取元素。
我有一个 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;
}
我的第一种方法是在实际的外部循环中使用另一个 for 循环,然后将 i 递增 3:
for (int j=i+1; j<=i+3; j++)
{
if (!fileContent.get(j).matches(PATTERN))
{
return false;
}
}
i+=3;
如您所见,使该方法执行我希望它执行的操作并不难,但是......我不确定是否有一种方法可以称为 more优雅.
你可以重复三次并在获取元素时使用++i
:
for (int j = 0; j < 3; j++) {
if (!fileContent.get(++i).matches(PATTERN)) {
return false;
}
}
或者用流做这样的事情:
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;
}
在我看来,您应该创建一个方法,该方法采用数组和索引作为开始查找的依据,return 布尔值是否与这三个匹配。这是优雅的方式。
你可以通过引入一个状态只用一个循环来完成:
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;
}
This question is more about best practice than about fetching elements
from a list.
在进入细节之前先说几句..
NORMAL.equals(fileContent.get(i))
而不是 fileContent.get(i).equals(NORMAL)
将避免 NullPointerException
- 在迭代下三个元素之前,您应该首先检查您的
List
是否有下一个三个元素以避免 ArrayIndexOutOfBoundException
现在,如果它只检查接下来的三个元素,如果这三个元素中的任何一个与模式不匹配,则只检查 return 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;
}
问题 在这种方法中,它不会检查您的列表是否没有接下来的三个元素。
至于您允许检查下一个可用元素的方法,您只需添加一个条件来检查您的列表是否在 loop[ 中有下一个元素=39=] 在调用 get
方法之前 list.Your 迭代下三个元素的方法似乎很好,但需要进行以下改进。
for (int j=i+1; j<=i+3; j++){
if (fileContent.size() < j && !fileContent.get(j).matches(PATTERN)){
return false;
} else {
break;
}
}
这个问题更多的是关于最佳实践,而不是关于从列表中获取元素。
我有一个 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;
}
我的第一种方法是在实际的外部循环中使用另一个 for 循环,然后将 i 递增 3:
for (int j=i+1; j<=i+3; j++)
{
if (!fileContent.get(j).matches(PATTERN))
{
return false;
}
}
i+=3;
如您所见,使该方法执行我希望它执行的操作并不难,但是......我不确定是否有一种方法可以称为 more优雅.
你可以重复三次并在获取元素时使用++i
:
for (int j = 0; j < 3; j++) {
if (!fileContent.get(++i).matches(PATTERN)) {
return false;
}
}
或者用流做这样的事情:
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;
}
在我看来,您应该创建一个方法,该方法采用数组和索引作为开始查找的依据,return 布尔值是否与这三个匹配。这是优雅的方式。
你可以通过引入一个状态只用一个循环来完成:
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;
}
This question is more about best practice than about fetching elements from a list.
在进入细节之前先说几句..
NORMAL.equals(fileContent.get(i))
而不是fileContent.get(i).equals(NORMAL)
将避免NullPointerException
- 在迭代下三个元素之前,您应该首先检查您的
List
是否有下一个三个元素以避免ArrayIndexOutOfBoundException
现在,如果它只检查接下来的三个元素,如果这三个元素中的任何一个与模式不匹配,则只检查 return 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;
}
问题 在这种方法中,它不会检查您的列表是否没有接下来的三个元素。
至于您允许检查下一个可用元素的方法,您只需添加一个条件来检查您的列表是否在 loop[ 中有下一个元素=39=] 在调用 get
方法之前 list.Your 迭代下三个元素的方法似乎很好,但需要进行以下改进。
for (int j=i+1; j<=i+3; j++){
if (fileContent.size() < j && !fileContent.get(j).matches(PATTERN)){
return false;
} else {
break;
}
}