11

当然,这在 java 中是不可能的(迄今为止),但理想情况下我想实现它,因为它是许多迭代的核心。例如,第一次多次调用它时,我在创建ArrayList. 不幸的是,我的实际代码没有循环set内部;else因此它会通过命令和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);
    }

有什么想法或理论吗?if当涉及到语句和ArrayList命令等时,我不确定 java 的速度

4

7 回答 7

20

我错过了什么吗?

这不是假设的代码吗

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);
}

(后者更有意义......我猜)。无论哪种方式,很明显您可以重写循环,以便在循环内不会重复“其他测试”......就像我刚刚所做的那样。


FWIW,这很可能是过早优化的情况。也就是说,您可能在浪费时间优化不需要优化的代码:

  • 如您所知,JIT 编译器的优化器可能已经移动了代码,因此“else”部分不再在循环中。

  • 即使没有,您尝试优化的特定事物也可能不是重大瓶颈……即使它可能被执行 600,000 次。

我的建议是暂时忘记这个问题。让程序运行起来。当它工作时,决定它是否运行得足够快。如果没有,则对其进行分析,并使用分析器输出来决定值得花时间优化的地方。

于 2012-05-28T22:34:08.547 回答
2

我不明白为什么有一段时间的封装......

采用

//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);
     }    
}
于 2012-05-28T22:32:00.033 回答
1

将“set”语句包装为“如果未设置则设置”并将其裸露在 while 循环之上。

你是对的,这种语言并没有提供你正在寻找的语法,但那是因为有像我刚才建议的那样的编程范式,所以你不需要你提出的语法。

于 2012-05-28T22:30:23.293 回答
1
boolean entered = false, last;
while (( entered |= last = ( condition ) )) {
        // Do while
} if ( !entered ) {
        // Else
}

别客气。

于 2017-06-10T15:41:58.770 回答
0

Java 没有这种控制结构。
但应该注意的是,其他语言也是如此。
例如,Python 具有while-else结构。

在 Java 的情况下,您可以模仿这种行为,正如您已经展示的那样:

if (rowIndex >= dataColLinker.size()) {
    do {
        dataColLinker.add(value);
    } while(rowIndex >= dataColLinker.size());
} else {
    dataColLinker.set(rowIndex, value);
}
于 2016-06-27T02:35:28.020 回答
0

此 while else 语句应仅在条件为 false 时执行 else 代码,这意味着它将始终执行它。但是,有一个问题,当你在 while 循环中使用 break 关键字时,else 语句不应该执行。

满足does条件的代码只有:

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
}
于 2017-08-09T22:41:46.443 回答
0

假设您来自 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);
    }

注意逻辑和逆向逻辑的必要性。我不确定这是一个很好的解决方案(逻辑的重复),但无括号else是我能想到的最接近的语法,同时保持相同的行为,即不执行超过所需的逻辑。

于 2017-10-20T21:07:56.750 回答