[英]System.currentTimeMillis() to int returns negative value
我正在開發一個應用程序,在其中我動態添加視圖並使用分配唯一ID,但它返回負值:
long time = System.currentTimeMillis();
view.setId((int)time);
因此,我在Google上搜索並找到了另一種解決方案,但是它也不起作用。 它還返回負值:
Long time = System.currentTimeMillis();
view.setId(time.intValue());
那么如何將System.currentTimeMills()
返回的long值安全地轉換為int
?
System.currentTimeMills()
返回1505645107314
而轉換為int
返回-1888413582
。
當將大的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());
你做不到 為什么將時間用作唯一ID? 不好的方法。
例如, 2147483648
將被表示為-2147483648
。 對於較小的值,強制轉換就足夠了:
long l = 42;
int i = (int) l;
但是, long
可以容納比int
更多的信息,因此在一般情況下,不可能完全將long
轉換為int
。
您可以將整數范圍內的哈希值用作唯一ID。
currentTimeMillis
返回一個long值,該長度有時不適合int值。 因此,我不認為您應該使用此方法為視圖設置唯一的int
id。
如果要為創建的每個視圖都擁有唯一的int
,請嘗試這種方法,並創建一個靜態計數器thing:
static int nextViewID = 0;
創建新視圖時,您只需
view.setId(nextViewID);
nextViewID++;
如果您想要一個隨機的唯一整數,則可以執行以下操作:
Set
java.util.Random
生成隨機整數 這很正常。 在某些情況下,將較大的數據類型(例如long)轉換為較小的數據類型(例如int)可能會導致值更改。 您可以通過除以某個預設常數(例如10,000)來設計其他方法。 例如:
Long t = System.currentTimeMillis() / 10000;
view.setId((int) t);
這肯定會給您帶來積極的價值!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.