2017-09-17 25 views
1

我開發一個應用程序中,我動態添加視圖並使用分配一個唯一的ID,但它返回負值負值:System.currentTimeMillis的()爲int的回報

long time = System.currentTimeMillis(); 
view.setId((int)time); 

所以我搜索的谷歌並找到了另一個解決方案,但是它也不起作用。它還返回負值:

Long time = System.currentTimeMillis(); 
view.setId(time.intValue()); 

所以,我怎麼能轉換通過System.currentTimeMills()回到int安全長期價值?

System.currentTimeMills()返回1505645107314,同時轉換爲int返回-1888413582

+1

該值不適用於int。使用很長。 – algrid

+0

感謝您的快速響應,但view.setId()方法需要int值和唯一 –

回答

0

將大的long值轉換爲int時,值將會更改。您可能希望將時間除以1000,以秒爲單位獲得時間,或者從1天前的時間中減去該值(取決於您喜歡的唯一性),並將其用作視圖的ID。

view.setId((int)(time/1000)); //this gives unique id for every second. 

編輯 使用下面的代碼來獲得唯一的ID爲每毫秒:

Calendar calendar = Calendar.getInstance(); 
calendar.add(Calendar.DATE, -1); 
long yesterday = calendar.getTimeInMillis(); 
int uniqueId = (int) (yesterday - System.currentTimeMillis()); 
+0

除以1000的作品,但它是穩定的嗎?我的意思是我希望這個代碼..將來會產生像獲得負值的問題嗎? –

+0

@jayeshgurudayalani檢查已編輯的答案以獲得更精確的結果。 –

0

你不能做到這一點。你爲什麼使用時間作爲唯一的ID?糟糕的做法。

例如,2147483648將被表示爲-2147483648。對於小值,鑄造是不夠的:

long l = 42; 
int i = (int) l; 

然而,long可以比int存儲更多的信息,所以它不可能完美地轉換從longint,在一般情況下。

您可以使用整數限制內的哈希值作爲唯一的ID。

0

currentTimeMillis返回一個long,有時可能不適合int。因此,我認爲你不應該使用這種方法來爲視圖設置唯一的int ID。

如果你想爲你們每一個人創建視圖的唯一int,試試這個方法,創建靜態反啄:

static int nextViewID = 0; 

當您創建一個新的視圖,你只是

view.setId(nextViewID); 
nextViewID++; 

如果你想隨機唯一的整數,你可以做這樣的事情:

  • 創建靜態Set
  • 生成使用java.util.Random
  • 嘗試將號碼添加到組的隨機整數
  • 保持生成另一個整數,直到你成功添加的數量設定
0

這是正常。在某些情況下,從大數據類型(如long)轉換爲較小的數據類型(如int)可能會導致值的更改。您可以通過除以某個預設常數(比如10,000)來設計其他方法。例如:

Long t = System.currentTimeMillis()/10000; 
view.setId((int) t); 

這肯定會給你一個正面的價值!

相關問題