System.currentTimeMillis的()为int的回报
我开发一个应用程序中,我动态添加视图并使用分配一个唯一的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
。
将大的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());
除以1000的作品,但它是稳定的吗?我的意思是我希望这个代码..将来会产生像获得负值的问题吗? –
@jayeshgurudayalani检查已编辑的答案以获得更精确的结果。 –
你不能做到这一点。你为什么使用时间作为唯一的ID?糟糕的做法。
例如,2147483648
将被表示为-2147483648
。对于小值,铸造是不够的:
long l = 42;
int i = (int) l;
然而,long
可以比int
存储更多的信息,所以它不可能完美地转换从long
到int
,在一般情况下。
您可以使用整数限制内的哈希值作为唯一的ID。
currentTimeMillis
返回一个long,有时可能不适合int。因此,我认为你不应该使用这种方法来为视图设置唯一的int
ID。
如果你想为你们每一个人创建视图的唯一int
,试试这个方法,创建静态反啄:
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);
这肯定会给你一个正面的价值!
该值不适用于int。使用很长。 – algrid
感谢您的快速响应,但view.setId()方法需要int值和唯一 –