我可以检查迭代变量以了解foreach循环是否一直运行到Java结束吗?
在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
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()。这就是当你不为你的文章编写单元测试时得到的结果。