Java 从 ArrayList 获取子内容

Java get sub content from ArrayList

这很复杂。我正在构建一个 GUI,它将获取一个文本文件,当我按下 "Start" 按钮时,它将启动 "BufferReader" 函数以将文件中的所有行读取到一个名为 "list" 的 ArrayList 中。之后,我需要从数组 "list" 中捕获所有以字母 "CE-" 开头的字符串,然后使用数组 "list" 的下一个索引,直到代码再次获取以字母 "list" 开头的字符串有 "CE-" 个字母。 "CE-" 之间的所有字符串都需要添加到名为 "CE" 的新 ArrayList 中。

这是文本文件的一小部分:

CE-system-components-accessmanager:
   Access control enable                             ,disabled
   Access policy prototyping                         ,enabled
   Access user group                                 ,enabled
   Implicit roles access policy                      ,disabled
   World access policy                               ,disabled

CE-system-components-eqlog:
   EquipmentLog Enable                               ,false

CE-system-components-eventlog:
   Eventlog Enable                                   ,false

这是需要在 "CE-" 之间的索引中获取字符串的代码部分:

            for(String s : list) {
                if(s.contains("CE-")){
                    int idx = (list.indexOf(s))+1;
                    String txt = list.get(idx);
                    System.out.println(txt);
                    CE.add(txt);
                }
            }          
            System.out.println(CE);

我这段代码的输出只有第一个参数。

 Access control enable                             ,disabled
 EquipmentLog Enable                               ,false
 Eventlog Enable                                   ,false

我的问题是如何获取所有参数?我已经尝试了一些代码,但它不起作用。

您可以先创建一个函数来检查以另一个字符串开头的字符串。

startsWith (start, string) {
 for (let i = 0; i < start.length; i++)
  if (start[i] !== string[i])
    return false

 return true
}

对每一行执行此操作,当您到达 "CE-" 行时,开始向您的数组添加行。 您还需要知道哪个 char 元素出现在参数的开头。对我来说,它看起来像一个制表符 '\t'。

addLines (strArray) {
  let start = "CE-"
  let paramStart = '\t'
  let resultArr = []
  let addMode = false

  for (let i = 0; i < strArray.length; i++) {
    if (addMode) {
     if (paramStart === strArray[i][0]) // Check if its a Param line
       resultArr.push(strArray[i])
     else
       addMode = false //Means that you found a new Title, but you still 
                       dont know
                       // if it is a "CE-"
    }

     if(!addMode) // Prevent that you check for Titles when adding param
      if (startsWith(start, strArray[i])) 
       addMode = true                     
  }

  return resultArr
}

if(addMode)if(!addMode) 可能看起来很糟糕,但您仍然需要它们。当您添加参数时,您不知道下一个标题何时出现,因此您仍然需要在同一交互中检查该行。这就是为什么它不是 if else 语句

我想就是这样了。我没有测试它,但即使它不完美,我想它也能为你指明正确的方向。抱歉,我在 Javascript 中做了所有事情,但你明白了。 :P

此代码使用布尔值 inCE 来跟踪 CE 块中的行。当看到 'CE-' 行时设置为真,看到空行时设置为假。

boolean inCE = false;

for (String line : lines) {
   if (line.contains("CE-")) {
     inCE = true;
   }
   else if (line.trim().isEmpty()) {
     inCE = false;
   }
   else if (inCE) {
     System.out.println(line);
     CE.add(line);
   }
}