Java从ArrayList获取子内容

时间:2018-08-28 11:17:12

标签: java arrays user-interface swt

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

  • 所有以“ CE-”字母开头的字符串均为标题。
  • 所有包含“ CE-”的索引之间的字符串都是我的参数。
  • 文件包含其他标题,不仅是“ CE-”

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

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

我的问题是如何获取所有参数?我已经尝试了一些代码,但是无法正常工作。

2 个答案:

答案 0 :(得分:1)

此代码使用布尔值inCE来跟踪CE块中的行。看到“ CE-”行时设置为true,看到空白行时设置为false。

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

答案 1 :(得分:0)

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

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