Java 从 ArrayList 获取子内容
Java get sub content from ArrayList
这很复杂。我正在构建一个 GUI,它将获取一个文本文件,当我按下 "Start" 按钮时,它将启动 "BufferReader" 函数以将文件中的所有行读取到一个名为 "list" 的 ArrayList 中。之后,我需要从数组 "list" 中捕获所有以字母 "CE-" 开头的字符串,然后使用数组 "list" 的下一个索引,直到代码再次获取以字母 "list" 开头的字符串有 "CE-" 个字母。 "CE-" 之间的所有字符串都需要添加到名为 "CE" 的新 ArrayList 中。
- 所有以 "CE-" 字母开头的字符串都是标题。
- 包含[=36=]的索引之间的所有字符串都是我的参数。
- 该文件包含其他标题,不仅"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
我的问题是如何获取所有参数?我已经尝试了一些代码,但它不起作用。
您可以先创建一个函数来检查以另一个字符串开头的字符串。
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);
}
}
这很复杂。我正在构建一个 GUI,它将获取一个文本文件,当我按下 "Start" 按钮时,它将启动 "BufferReader" 函数以将文件中的所有行读取到一个名为 "list" 的 ArrayList 中。之后,我需要从数组 "list" 中捕获所有以字母 "CE-" 开头的字符串,然后使用数组 "list" 的下一个索引,直到代码再次获取以字母 "list" 开头的字符串有 "CE-" 个字母。 "CE-" 之间的所有字符串都需要添加到名为 "CE" 的新 ArrayList 中。
- 所有以 "CE-" 字母开头的字符串都是标题。
- 包含[=36=]的索引之间的所有字符串都是我的参数。
- 该文件包含其他标题,不仅"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
我的问题是如何获取所有参数?我已经尝试了一些代码,但它不起作用。
您可以先创建一个函数来检查以另一个字符串开头的字符串。
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);
}
}