我正在开发一个应用程序,我在其中动态添加视图并分配使用的唯一ID,但它返回负值:
long time = System.currentTimeMillis();
view.setId((int)time);
所以我在google上搜索并找到了另一个解决方案但是它也没有用。它还返回负值:
Long time = System.currentTimeMillis();
view.setId(time.intValue());
那么如何安全地将System.currentTimeMills()
返回的长值转换为int
?
System.currentTimeMills()
返回1505645107314
,转换为int
时会返回-1888413582
。
答案 0 :(得分: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());
答案 1 :(得分:0)
你无法做到。为什么你用时间作为唯一身份?不好的做法。
例如,2147483648
将表示为-2147483648
。对于小值,铸造就足够了:
long l = 42;
int i = (int) l;
但是,long
可以包含的信息多于int
,因此无法完全从long
转换为int
。情况下。
您可以将整数限制内的哈希值用作唯一ID。
答案 2 :(得分:0)
currentTimeMillis
返回一个long,有时候不适合int。因此,我认为您不应该使用此方法为视图设置唯一的int
ID。
如果您想为自己创建的每个视图创建一个唯一的int
,请尝试这种方法,创建一个静态计数器:
static int nextViewID = 0;
创建新视图时,只需
view.setId(nextViewID);
nextViewID++;
如果你想要一个随机唯一整数,你可以这样做:
Set
java.util.Random
答案 3 :(得分:0)
这很正常。在某些情况下,从大型数据类型(如long)转换为较小的数据类型(如int)可能会导致值的更改。您可以通过除以某个预设常量(例如10,000)来设计其他方法。例如:
Long t = System.currentTimeMillis() / 10000;
view.setId((int) t);
这肯定会给你一个积极的价值!