Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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
我可以检查迭代变量以了解foreach循环是否一直运行到Java结束吗?_Java_Foreach - Fatal编程技术网

我可以检查迭代变量以了解foreach循环是否一直运行到Java结束吗?

我可以检查迭代变量以了解foreach循环是否一直运行到Java结束吗?,java,foreach,Java,Foreach,在Java中,我想浏览元素列表,并在正确的位置插入一个新的元素。我想这样做: for( Tab tab : tabList ) if( newTab.getPriority() < tab.getPriority() ) { newTab.insertBefore(tab); break; } if( tab == null ) newTab.insertBefore(endMarker); for(选项卡:表格列表) if(newTab.getPriorit

在Java中,我想浏览元素列表,并在正确的位置插入一个新的元素。我想这样做:

for( Tab tab : tabList )
  if( newTab.getPriority() < tab.getPriority() ) {
    newTab.insertBefore(tab);
    break;
  }
if( tab == null )
  newTab.insertBefore(endMarker);
for(选项卡:表格列表)
if(newTab.getPriority()

不幸的是,
选项卡
在for循环之外无法访问。有什么简单的方法可以实现我想要的或者我必须使用布尔值吗?

选项卡
的作用域是
for
循环的主体,如果我记得我的Java是正确的(如果它的工作方式是“预期的”,即
for
作用域在C99和C++中是如何工作的),因此这可能无法编译。

您不能在循环之外访问
foreach
迭代器变量,因为它超出了范围。在编写时,上面的代码没有编译

您可以使用多种技术,例如使用您提到的
boolean
。您还可以使用“”,这是一个虚拟选项卡,放在
tabList
的末尾,具有为此目的保留的最大优先级(即,任何“真实”选项卡都不能具有此优先级)。这保证了当您到达sentinel选项卡时,循环内的
if
条件将为真


最后,您还可以将
选项卡
实现为
可比
,或者为其定义单独的
比较器
,并使
表格列表
成为有序集合。这样,您甚至不需要哨兵,甚至不需要
foreach
循环;您只需将
newTab
添加到已排序的集合中,并让它确定在何处插入即可。例如,如果
tabList
TreeSet
,则插入将是
O(log n)
。到目前为止提到的其他技术是
O(n)

最好在
for
循环的范围之外使用
选项卡
变量

Tab selected_tab = null;

for ( Tab tab: tabList ) {
    if (tab_I_want(tab)) {
       selected_tab = tab;
       break;
    }
}

// selected_tab is either null or the tab you want

选项卡
在循环外部不可用。你可以做很多事情。使用
布尔值
就是其中之一。

在foreach样式的循环中,我认为您不可能知道这一点。但是,可以在循环之外使用迭代器:

Iterator iter = tabList.iterator();
while (iter.hasNext()) {
  Tab newTab = iter.next();
  if( newTab.getPriority() < tab.getPriority() ) {
    newTab.insertBefore(tab);
    break;
  }
}

if (iter.hasNext()) {
  // You've still got elements left!
}
Iterator iter=tabList.Iterator();
while(iter.hasNext()){
Tab newTab=iter.next();
if(newTab.getPriority()
您可以引发异常并在循环外捕获它,而不是中断。我忘记了Java中的语法,但Python是这样的:

broken = False

try:
    for i in list:
        if i.condition == True:
            raise Exception
except Exception:
    # you know something has broken the flow
    broken = True

如果最后一件坏了怎么办?从技术上讲,每个项目都经过了检查。

由于
选项卡
变量的作用域,这不会编译。您可以执行以下操作

Tab lastTab = null;
for (Tab tab : tabList) {
    if (..) {
       ..
       lastTab = tab;
    }
}

同意上述观点。我不相信你可以在小报列表被迭代时修改它

另一种方法是在列表中找到要添加到的位置,然后执行添加操作

int i = 0;
for (; i < tabList.length; i++)
{
    if( newTab.getPriority() < tabList[i].getPriority() )
        break;
}

// this will shift the current item at that index value into the next one, and insert newtab into the specified index
tabList.add(i, newTab);
inti=0;
对于(;i
将其转换为工作代码的最明显方式是:

insertBlock: {
    int newPriority = newTab.getPriority();
    for (Tab tab : tabs) {
        if (newPriority < tab.getPriority()) {
            newTab.insertBefore(tab);
            break insertBlock;
        }
    }
    newTab.insertBefore(endMarker);
}
insertBlock:{
int newPriority=newTab.getPriority();
用于(选项卡:选项卡){
if(newPriority

虽然似乎没有多少人熟悉这一功能。碰巧的是,正是这一功能允许从语言中删除
goto

多亏了这两个快速答案。。。我刚想出来并编辑了我的问题,但你太快了@奥利:那是个坏主意。创建、抛出和捕获异常与设置标志和执行
中断
相比是非常昂贵的。成本是生成异常实例,虽然它比if或迭代器检查大得多,但规模不大,并且不会再次破坏经济,除非您每秒运行100次此代码。这不是最好的解决方案,但如果实际流程更适合,这是OP的“开箱即用”理念。我同意Stephen的观点,但主要是因为使用异常驱动代码流通常会降低代码的可读性。我会发现休息时间不太容易阅读,但我想这是一个主观问题。
iter
并没有在循环内部得到改进。此代码无效。忘记添加iter.next()。这就是当你不为你的文章编写单元测试时得到的结果。