我有一个方法,将地图作为传入参数。地图的关键字可以是Long或Integer数据类型。
我正在使用方法map.containsKey()
检查传入的地图中是否包含随机生成为基本类型int的数字。
当map的键为Long类型且map.containsKey()
的计算结果为false时,会出现问题。即使映射包含Long形式的int键值。
但是如果我尝试将int转换为long,那么预期整数的地图将会出现相同的错误。
我想知道是否有办法获取Map键的数据类型,然后将生成的数字转换为该类型,以便我可以使用map.containsKey()
方法?
我理解并希望我可以使用long作为两个映射的键值,但这不符合赋值的要求。
感谢任何帮助。
以下是我正在使用的代码和字段
private TreeMap<Integer, LabClass> classes;
private HashMap<Long, Member> members;
public long generateUniqueNumber(AbstractMap map, int low, int high)
{
Random rand = new Random();
int number = OUT_OF_BOUNDS;
int max = high - low + 1;
if (map.size() < max)
{
do {
number = rand.nextInt(max) + low;
} while (map.containsKey(number) );
}
return number;
}
答案 0 :(得分:0)
只需使用Long作为键类型,然后就不需要进行强制转换。 (也许你有理由不使用Long作为密钥)
答案 1 :(得分:0)
您可以使用.getClass()
从对象获取数据类型,并检查它是整数还是长整数。
除非您正在做一些非常大的事情而且您正试图保存数据,否则在将它们添加到地图时应将所有整数转换为long。请记住,一个整数可以是一个整数,但是长整数可以不是一个整数,除非long在整数的最大尺寸范围内。
答案 2 :(得分:0)
最简单的解决方案是更改while
声明:
while (map.containsKey(number) || map.containsKey((long) number))
由于密钥可能是整数或可能是Longs,因此您也可以检查是否存在任何类型的密钥。
更新: contract for the containsKey method表示如果密钥属于此地图的类型不合适,可能会抛出ClassCastException。“所以我的答案不可行。
答案 3 :(得分:0)
for (Long key : map.keySet()) {
// check if int i == (int) (long) key;
}