Java:如何循环浏览三个列表<;字符串>;
我有三个Java:如何循环浏览三个列表<;字符串>;,java,loops,for-loop,foreach,Java,Loops,For Loop,Foreach,我有三个列表变量:类文件,用户名,和文件目录。我有一个字符串(一个字符串列表,但我会将列表中的每个字符串与下面的循环进行比较),它由每个列表中的一个项目组成。我想遍历所有三个列表,并检查字符串中是否有三个列表中的一个值 最好的办法是什么 for(String classFile:classFiles) { //if contains classfile statement for(String username:usernames) { //if contains username st
列表
变量:类文件
,用户名
,和文件目录
。我有一个字符串
(一个字符串列表,但我会将列表中的每个字符串与下面的循环进行比较),它由每个列表中的一个项目组成。我想遍历所有三个列表,并检查字符串中是否有三个列表中的一个值
最好的办法是什么
for(String classFile:classFiles) {
//if contains classfile statement
for(String username:usernames) {
//if contains username statement
for(String fileDirectory:fileDirectories) {
//if contains filedirectory statement
}
}
}
或
或
还是有更好的方法
编辑:示例
classFiles - a1, a2, a3
usernames - noc1, noc2, noc3
fileDirectories - C:/projects/a1/noc1/example.java, C:/projects/a1/ad3/example.java
和要检查的字符串
String - C:/bin/a1/noc1/example.class
我要做的是,如果fileDirectory和String都包含一个类文件和用户名,那么将其添加到列表中
因此,在本例中,
C:/bin/a1/noc1/example.class
将被添加到列表中,但C:/bin/a4/fd1/example.class
不会被添加或C:/bin/a3/noc3/example.class
不会被添加到列表中,因为对每个循环执行删除操作并不是最佳选择。您应该使用迭代器并在迭代器上删除,以避免并发修改异常
反而
for(String fileDirectory:fileDirectories){
//remove items from list that do not contain fileDirectory
}
你应该这样做
Iterator iter = fileDirectores.iterator();
while(iter.hasNext())
{
//Get next
//Do your check
iter.remove();
}
这将导致有三个单独的迭代来完全满足您的需求。所以我认为您想要得到所有三个列表之间的交集? 只需使用列表中的
retainAll
方法即可
classFiles.retainAll(usernames);
classFiles.retainAll(fileDirectories);
<>现在>代码>类文件< /代码>将只有三个列表之间的交集。 < P>可以考虑使用哈希集或HasMax快速访问字符串值(使用包含(string))?< /P> 它将消除循环
如果我能很好地理解问题(不确定^^)我会这样做,有时最好定义您实际尝试编写的函数:
/**
* Checks to see if candidate has one string in each of classFiles, usernames and fileDirectories
*/
public boolean hasEssentialComponents(List<String> candidate) {
//Code here
}
/**
*检查候选文件在类文件、用户名和文件目录中是否各有一个字符串
*/
公共布尔hassentialComponents(候选列表){
//代码在这里
}
现在,您的第一个选项有一个非常长的最大运行时间O(n^3)。如果您预期函数通常会失败,那么这意味着对于三个列表中的每个项目,您都在循环下一个列表。其中大部分是多余的,如果这些列表很长,您将对性能产生巨大影响
第二种方法略有不同,但总运行时间相同
第三个明显更好;在这种情况下,一旦您发现列表中没有组件,并且您从未两次检查列表中的组件,您可能会失败。然而,Java提供了一些可以使这更容易的方法
public boolean hasEssentialComponents(List<String> candidates) {
//Sanity check the data
if (candidate.size() != 3) { return false; } //I'm assuming a 'good' candidate has only three items.
valid = true;
for (String candidate:candidates) {
if (valid &&
! ( check(this.classFiles, candidate)
|| check(this.usernames, candidate)
|| check(this.fileDirectories, candidate) )
)) {
valid = false;
}
}
return valid;
}
private boolean check(List<String> masterList, String candidate) {
return masterList.contains(candidate);
}
公共布尔hassentialComponents(列出候选项){
//检查数据是否正确
如果(candidate.size()!=3){return false;}//我假设一个“好”的候选者只有三项。
有效=真;
for(字符串候选:候选){
如果(有效&&
!(检查(this.classFiles,候选者)
||检查(这是用户名、候选人)
||检查(this.fileDirectories,候选者))
)) {
有效=错误;
}
}
返回有效;
}
私有布尔检查(列表主列表、候选字符串){
返回主列表。包含(候选);
}
现在,我在这里不必要地罗嗦,以确保梳理出问题的各个部分。请注意,如果可能,您应该使用Java内置函数;它们优化得很好。不要把你的清单加在一起;你花了不必要的时间复印。此外,如果您只需要进行一次比较:请注意,如果您知道字符串列表中的元素应该在主列表中的哪个位置,则可以做得更好
最后,我真的建议您首先写出一个方法签名。它迫使你思考你到底在做什么。检查的目的是什么?确定这三个元素具体是什么?对于问题有一点帮助会有帮助。请考虑用示例数据来重申你的问题。现在还不清楚你想要完成什么。你在列表上尝试的三种重复操作,它们是完全不相关的吗?如果是这种情况,那么所有三种方法都将具有相同的性能(O(n))。为什么不想执行“If(classFiles.contains(string))//do sth”?@Santosh前两种方法是O(n^3)。我认为这不是他的目的。正如我理解的那样,实际上有第四个列表-一个字符串列表,其中该列表的每个元素都有几个子字符串。他想将这些子字符串与3个“选项”列表进行比较。是的,bfishmam是正确的。我想检查第4个列表中的每个元素,该元素是否包含其他3个列表中的每个元素的字符串。这是我正在尝试做的事情的最佳方式还是最好的方式?是的,我觉得这是最佳/安全的方式。是的,我使用了迭代器,经过一点工作后,我开始使用迭代器。。。干杯:)
/**
* Checks to see if candidate has one string in each of classFiles, usernames and fileDirectories
*/
public boolean hasEssentialComponents(List<String> candidate) {
//Code here
}
public boolean hasEssentialComponents(List<String> candidates) {
//Sanity check the data
if (candidate.size() != 3) { return false; } //I'm assuming a 'good' candidate has only three items.
valid = true;
for (String candidate:candidates) {
if (valid &&
! ( check(this.classFiles, candidate)
|| check(this.usernames, candidate)
|| check(this.fileDirectories, candidate) )
)) {
valid = false;
}
}
return valid;
}
private boolean check(List<String> masterList, String candidate) {
return masterList.contains(candidate);
}