我有一个属性文件,并尝试根据条件读取一些值。
属性文件的内容:
TEST0000000000000000000000000000
TEST00000000000000000000000000
TEST000000000000000000000000300
TEST000000000000000000000000000
TEST000000000000000000000000000
TEST000000000000000000050000000
XXX_LOGIN=//xpath
XXX_PWD=//xpath
使用以下代码读取属性文件。
public ArrayList<String> getMbunValues() throws IOException {
Properties p = new Properties();
ArrayList<String> values = new ArrayList<String>();
try {
p.load(new FileInputStream("C:/Testing/Properties.properties"));
} catch (FileNotFoundException ex) {
}
Enumeration e = p.propertyNames();
for (; e.hasMoreElements();) {
//System.out.println("size"+e.nextElement());
//System.out.println(e.nextElement());
values.add(e.nextElement().toString());
}
return values;
}
}
1.现在我试图在两个单独的函数中获取这些值。一个用于从TEST开始的值。
2.另一个用于XXX_LOGIN等等</ p>
问题:
为了通过TEST获取值,我可以根据以下代码删除XXX_LOGIN值。
public ArrayList<String> useMbunValues() throws IOException {
ArrayList<String> mbunvaluesList = file.getMbunValues();
Collections.sort(mbunvaluesList);
for (int i = 0; i < mbunvaluesList.size(); i++) {
if ((mbunvaluesList.get(i).contains("_"))) {
mbunvaluesList.remove(mbunvaluesList.get(i));
}
}
for (int i = 0; i < mbunvaluesList.size(); i++) {
System.out.println(mbunvaluesList.get(i));
}
return mbunvaluesList;
}
以上函数返回
TEST0000000000000000000000000000
TEST00000000000000000000000000
TEST000000000000000000000000300
TEST000000000000000000000000000
TEST000000000000000000000000000
TEST000000000000000000050000000
但XXX_LOGIN = // xpath函数也返回TEST值。我使用了以下代码
//Values assigned to array list
public ArrayList<String> useXpathValues() throws IOException {
ArrayList<String> xpathvaluesList = new ArrayList<String>();
xpathvaluesList = file.getMbunValues();
//Traversing array list
for (int i = 0; i < xpathvaluesList.size();) {
if (!xpathvaluesList.get(i).contains("_")) {
xpathvaluesList.remove(xpathvaluesList.get(i));
System.out.println(xpathvaluesList);
i=i+1;
}
}
for (int i = 0; i < xpathvaluesList.size(); i++) {
System.out.println(xpathvaluesList.get(i));
}
return xpathvaluesList;
}
以上功能的输出如下
TEST0000000000000000000000000000
TEST000000000000000000000000300
XXX_LOGIN
但我只需要带下划线字符的值。
有人可以帮帮我吗?
谢谢, 维沙尔
答案 0 :(得分:1)
看看这个循环:
for (int i = 0; i < xpathvaluesList.size();) {
if (!xpathvaluesList.get(i).contains("_")) {
xpathvaluesList.remove(xpathvaluesList.get(i));
System.out.println(xpathvaluesList);
i = i + 1;
}
}
i
什么时候会增加?仅在删除包含下划线的元素之后。否则你将无限循环运行,或者如果所有元素都有下划线,你最终会得到一个空列表。
此外,条件为i < xpathvaluesList.size()
,但是当您从列表中删除元素时,大小会发生变化,并且当您删除元素时i
增长,这意味着您将永远不会遍历整个列表,因此最终列出了您不需要的列表中的元素。
要解决当前方法的问题,请使用其他列表来保存所需的值。
如果您想使用相同的列表,请使用Iterator
及其remove
方法。
public ArrayList<String> useXpathValues() throws IOException {
ArrayList<String> xpathvaluesList = getMbunValues();
Iterator<String> iterator = xpathvaluesList.iterator();
while(iterator.hasNext()) {
String next = iterator.next();
if (! next.contains("_")) {
iterator.remove();
}
}
for (int i = 0; i < xpathvaluesList.size(); i++) {
System.out.println(xpathvaluesList.get(i));
}
return xpathvaluesList;
}
打印:
XXX_PWD
XXX_LOGIN
但正如M. Deinum建议的那样,你应该更好地逐行阅读文件,解析每个文件并同时构建两个列表。