Java while-else循环
当然,这在java中是一个不可能的语句(到目前为止),但是理想情况下,我希望实现它,因为它是许多迭代的核心。例如,在创建Java while-else循环,java,performance,arraylist,while-loop,theory,Java,Performance,Arraylist,While Loop,Theory,当然,这在java中是一个不可能的语句(到目前为止),但是理想情况下,我希望实现它,因为它是许多迭代的核心。例如,在创建ArrayList时,第一次多次调用它时,我正在执行650000多次。 不幸的是,我的实际代码在else循环中没有设置set;因此,它将跳过add和set命令,浪费时间 之后,我在另一个循环中使用它,它只执行集合,因为数据已经创建,并且这是与许多其他循环中的多嵌套,因此这是一个漫长的过程 ArrayList<Integer> dataColLinker = new
ArrayList
时,第一次多次调用它时,我正在执行650000多次。
不幸的是,我的实际代码在else
循环中没有设置set
;因此,它将跳过add
和set
命令,浪费时间
之后,我在另一个循环中使用它,它只执行集合,因为数据已经创建,并且这是与许多其他循环中的多嵌套,因此这是一个漫长的过程
ArrayList<Integer> dataColLinker = new java.util.ArrayList<Integer>();
...
...
public void setLinkerAt( int value, int rowIndex) {
...
while(rowIndex >= dataColLinker.size()) {
dataColLinker.add(value);
} else {
dataColLinker.set(rowIndex, value);
}
ArrayList DataCollinger=new java.util.ArrayList();
...
...
public void setLinkerAt(int值,int行索引){
...
而(rowIndex>=DataCollinger.size()){
datacollinger.add(值);
}否则{
datacollinger.set(行索引,值);
}
有什么想法或理论吗?
当涉及到if
语句和ArrayList
命令等时,我不确定java的速度将“set”语句包装为“set if not set”,并将其裸露在while循环上方
你是对的,这种语言并没有提供你想要的语法,但那是因为有像我刚才建议的那样的编程范例,所以你不需要你建议的语法。我不明白为什么会有一段时间的封装 使用
//使用适当的开始和结束。。。
对于(introwindex=0,e=65536;i=DataCollinger.size()){
datacollinger.add(值);
}否则{
datacollinger.set(行索引,值);
}
}
我是不是遗漏了什么
这不是假设的代码吗
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);
}
if (rowIndex >= dataColLinker.size()) {
do {
dataColLinker.add(value);
} while(rowIndex >= dataColLinker.size());
} else {
dataColLinker.set(rowIndex, value);
}
(我想后者更有意义)。无论哪种方式,很明显,您可以重写循环,这样“else测试”就不会在循环中重复了……正如我刚才所做的那样
FWIW,这很可能是过早优化的情况。也就是说,您可能在浪费时间优化不需要优化的代码:
- 众所周知,JIT编译器的优化器可能已经移动了代码,这样“else”部分就不在循环中了
- 即使没有,您尝试优化的特定内容也可能不是一个显著的瓶颈…即使它可能被执行600000次
我的建议是暂时忘记这个问题。让程序运行起来。当它运行起来时,确定它是否运行得足够快。如果它运行得不够快,则对其进行分析,并使用分析程序输出来确定在哪些方面值得花时间进行优化。Java没有这种控制结构。
但是,应该注意的是,其他语言也一样。
例如,Python具有这个构造 在Java的情况下,您可以模仿这种行为,正如您已经展示的:
不客气。这个while-else语句应该只在条件为false时执行else代码,这意味着它将始终执行它。但是,有一个问题,当您在while循环中使用break关键字时,else语句不应该执行 满足DOS条件的代码仅为:
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
def setLinkerAt(值,行索引):
isEnough=lambda i:return i
我能想到的最相似的是:
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);
}
public void setLinkerAt(int值,int行索引){
isEnough=(i)->{return i
注意对逻辑和反向逻辑的需要。我不确定这是一个很好的解决方案(逻辑的复制),但无括号的
else
是我能想到的最接近的语法,同时保持不执行超出要求的逻辑的相同行为。因此,您希望添加相同的值N次,然后您希望将rowIndex
更改为value?根据while-else
语句,它应该是break
as在else
code块中的最后一句。基于原来的问题有一个else子句连接到,而我不会试图对此进行争论,但是您可能会很好地纠正,元素的数量未知,这并不重要……您可以用一些.hasNext()替换Iadd
再通过set
。第二个示例看起来很好,但我可能知道何时添加和更改值,从而使它更好地简化…到单独的函数中。我不知道稀疏数组???基本上是这个列是我的表格模型的一部分
并识别链接行,你对解决这个问题可能有不同的想法吗?@xchiltonx-我不打算给你更多建议,因为我怀疑你在浪费时间进行过早优化。请参阅我的更新答案。+1代表Stephen。尝试优化这是浪费时间。如果有什么改进的方法吗
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);
}