同时,其他环
当然这在java(迄今为止)中是一个不可能的陈述,但理想情况下我想实现它,因为它是许多迭代的核心。 例如,第一次多次调用它在创建ArrayList
时我正在做650,000次。 不幸的是,现实是我的实际代码没有在else
循环中set
; 因此它会传递add
和set
命令并浪费时间。
之后我还在另一个循环中,它只执行集合,因为数据已经创建,并且这是多嵌套的,因此它是一个漫长的过程。
ArrayList dataColLinker = new java.util.ArrayList(); ... ... public void setLinkerAt( int value, int rowIndex) { ... while(rowIndex >= dataColLinker.size()) { dataColLinker.add(value); } else { dataColLinker.set(rowIndex, value); }
任何想法或理论? 在if
语句和ArrayList
命令等方面,我不确定java的速度
我错过了什么吗?
这个假设的代码不是
while(rowIndex >= dataColLinker.size()) { dataColLinker.add(value); } else { dataColLinker.set(rowIndex, value); }
意思是同样的事情?
while(rowIndex >= dataColLinker.size()) { dataColLinker.add(value); } dataColLinker.set(rowIndex, value);
或这个?
if (rowIndex >= dataColLinker.size()) { do { dataColLinker.add(value); } while(rowIndex >= dataColLinker.size()); } else { dataColLinker.set(rowIndex, value); }
(后者更有意义……我猜)。 无论哪种方式,很明显你可以重写循环,以便在循环中不重复“else test”……就像我刚刚做的那样。
FWIW,这很可能是过早优化的情况。 也就是说,您可能在浪费时间优化不需要优化的代码:
-
众所周知,JIT编译器的优化器可能已经移动了代码,因此“else”部分不再处于循环中。
-
即使它没有,也有可能你试图优化的特定事物不是一个重要的瓶颈……即使它可能被执行600,000次。
我的建议是暂时忘记这个问题。 让程序正常运行。 当它工作时,确定它是否运行得足够快。 如果没有,则对其进行分析,并使用分析器输出来确定值得花时间优化的地方。
我不明白为什么有一段时间的封装……
使用
//Use the appropriate start and end... for(int rowIndex = 0, e = 65536; i < e; ++i){ if(rowIndex >= dataColLinker.size()) { dataColLinker.add(value); } else { dataColLinker.set(rowIndex, value); } }
将“set”语句换行以表示“如果未设置则设置”并将其置于while循环上方。
你是对的,语言没有提供你正在寻找的语言,但那是因为有一些我刚刚建议的编程范例所以你不需要你提出的语法。
Java没有这种控制结构。
但应该注意,其他语言也是如此。
例如,Python具有while-else结构。
在Java的情况下,您可以像您已经显示的那样模仿这种行为:
if (rowIndex >= dataColLinker.size()) { do { dataColLinker.add(value); } while(rowIndex >= dataColLinker.size()); } else { dataColLinker.set(rowIndex, value); }
boolean entered = false, last; while ( (entered |= last = ( condition )) && last ) { // Do while } if ( !entered ) { // Else }
别客气。
例:
boolean entered = false, last; while ( (entered |= last = (atomic.get() > 3 && !status.destroyed()) && so on) && last ) { // Do while } if ( !entered ) { // Else }
这个while语句只应在条件为false时执行else代码,这意味着它将始终执行它。 但是,有一个问题,当你在while循环中使用break关键字时,else语句不应该执行。
满足条件的代码只是:
boolean entered = false; while (condition) { entered = true; // Set it to true stright away // While loop code // If you want to break out of this loop if (condition) { entered = false; break; } } if (!entered) { // else code }
假设你来自Python并接受同样的事情:
def setLinkerAt(value, rowIndex): isEnough = lambda i: return i < dataColLinker.count() while (not isEnough(rowIndex)): dataColLinker.append(value) else: dataColLinker[rowIndex] = value
我能想到的最相似的是:
public void setLinkerAt( int value, int rowIndex) { isEnough = (i) -> { return i < dataColLine.size; } if(isEnough()){ dataColLinker.set(rowIndex, value); } else while(!isEnough(rowInex)) { dataColLinker.add(value); }
注意需要逻辑和反向逻辑。 我不确定这是一个很好的解决方案(重复逻辑),但是无支撑的是我能想到的最接近的语法,同时保持不执行逻辑超过要求的相同行为。