Java while-else循环

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

当然,这在java中是一个不可能的语句(到目前为止),但是理想情况下,我希望实现它,因为它是许多迭代的核心。例如,在创建
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);
    }