2015-01-11 13 views
2

嘗試找到此答案的解決方案時遇到了很多麻煩,因爲很難專門搜索它。儘管如此,我會盡力解釋它。以某種方式生成X和Y ID

目前,我有以下代碼:

for(int x = 0; x < 10000; x++){ 
     for(int z = 0; z < 10000; z++){ 
      if(!exists(x + ";" + z)){ 
       return x + ";" + z; 
      } 
     } 
    } 

這是幾乎什麼我想除了數字將「生成」的方式做的是像這樣:

0; 0 0; 1 0; 2 0; 3 ... 0; 9999 1; 0 1; 1

我希望以下列方式生成數字「或類似」,同時確保每個組合都存在。

0;0 
1;0 
1;1 
0;1 

我創建了一個image來顯示如何生成數字。它可以從底部向左或從左至底。 (See image

謝謝!

+0

返回調用將結束for循環,是您遇到的問題嗎?你想用這些數字生成什麼?製作一個大字符串或列表,或者打印它們? –

+0

這段代碼將放在一個方法中,內部調用的exists(String s)方法將檢查我是否已經使用它們。 你可以忽略那個方法,就像我想打印出一個能夠解決我的問題的列表。 我不想改變訂單,我想要「混合」訂單。 – Jupiter

+0

我見過你的形象,現在我得到了問題。 「x」的範圍總是與「z」的範圍相同 - 也就是說它總是一個正方形? –

回答

1
int len = 3; 
for (int i = 0; i < len; i++) { 
    for (int j = 0; j <= i; j++) //println(i+";"+j); 
    for (int k = i-1; k >= 0; k--) //println(k+";"+i); 
} 

在上面的代碼len用於限定正方形的長度的目的(len是3以上,其代表一個3×3)。在您自己的代碼中,您選擇了10000,但打印值太大

想要的內容最容易處理兩個內部循環,一個處理垂直和另一個水平。除此之外,只需任意選擇哪一個處理每個迭代的角落。在上面的代碼中,j循環處理轉角情況

+1

工作效率最高,不會重複任何操作。 – Jupiter

0

你似乎在尋找的算法是:

for(int distanceFromCorner = 0; distanceFromCorner < 10000; distanceFromCorner++) { 
    for(int otherAxis = 0; otherAxis <= distanceFromCorner; otherAxis++) { 
     if(!exists(distanceFromCorner + ";" + otherAxis)) 
      return distanceFromCorner + ";" + otherAxis; 
     if(!exists(otherAxis + ";" + distanceFromCorner)) 
      return otherAxis + ";" + distanceFromCorner; 
    } 
} 

注意,這(像你原來的算法)會比需要的要慢得多,如果你想生成大量的ID。 (優化,這是一個單獨的問題)

+0

這似乎工作得最好,我不認爲我將永遠需要生成超過100,000個ID,這可能需要幾秒鐘,但這不是問題。謝謝你的幫助。 – Jupiter

+0

@Jupiter這可能不是一個問題,但如果我是你,它會讓我很煩,它花了幾秒鐘而不是幾微秒。 – immibis

+0

該方法不會被不斷調用,而且需要一些時間才能達到需要1-2秒的時間,或者甚至可能會少很多,因爲我在Eclipse中運行這個方法。 – Jupiter