2011-08-21 108 views
0

我寫了下面的代碼,它做我想做的事,但我認爲比在for循環中執行條件語句有更快的方法。Java for循環迭代和循環多個變量,直到條件滿足

int i,j,k,l; 
int[] X = new int[] {111,222,333,444}; 
int XL = X.length; 

for (i=0, j=1; i<XL; j=(j<XL-1)?j+1:0, i++) { 
    println("i:" +i +" j:" + j); 
} 

// returns: 
// i:0 j:1 
// i:1 j:2 
// i:2 j:3 
// i:3 j:0 
+2

你怎麼確定這樣太慢了? –

+3

而不是保留一個單獨的變量'j',你可以採取'(i + 1)%4'。 –

+3

哎呀。混淆代碼。沒人知道,這是關於什麼的。如果你想更快 - >用匯編語言編寫(readability將大致相同)。 –

回答

1

Kerrek SB的評論是我的首選解決方案。 這被改寫爲更常規:

String[] X = new String[] {"AAA", "BBB", "CCC", "DDD"}; 
int XL = X.length; 

for (int i=0; i<XL; i++) { 
    println("i:" +X[i] +" j:" + X[(i+1)%XL]); 
} 

將返回:

i:AAA j:BBB 
i:BBB j:CCC 
i:CCC j:DDD 
i:DDD j:AAA 
3

的問題以不同的角度比只是說「做X以做出更加快速的代碼50%」,你怎麼樣測試的代碼,你怎麼樣確定它的速度太慢?

Java的JIT編譯器這些天非常非常擅長它,使得這些微觀優化成爲可能,因此您不必這樣做。如果你開始做荒謬量的低級別的優化和混淆代碼有點傻:

  • 您可能會或可能不會實現小速度增加
  • 你會做你的代碼附近難以維護和難以閱讀
  • 你可以欺騙JIT編譯器爲不使的優化它會做,否則(因爲它知道比混淆代碼更爲常見的Java習慣用語。)

如果你還在,肯定,並不可避免地需要從每一個最後的速度增加你的一個應用程序然後最好的做法就是將這些位寫入彙編器。如果你只是爲了這個目的而儘量讓事情快一點,那麼最好的現實世界建議幾乎總是「不要打擾」。

+0

這更多的是讓它不那麼容易混淆......我需要一個for循環遍歷一個數組,其中包含多個鍵值i,j等,這些值都會遞增並在到達結尾時返回到開頭。 – mogga

+0

@Mogga:「迭代並返回到開始」聽起來完全像模塊化加法:-) –

0

首先,您的for循環並不像所有這些令人困惑,因此您可以添加一些註釋以使其更容易理解。

如果您想在考慮到可讀性的情況下重寫它,您可以使用一個索引器來完成此操作。

int i; 
int[] X = new int[] {111,222,333,444}; 


for (i=0; i < X.length; i++) { 
    println("i:" +i +" j:" + (i < X.lenght -1) ? i + 1 : 0); 
}