Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何循环浏览三个列表<;字符串>;_Java_Loops_For Loop_Foreach - Fatal编程技术网

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