我注意到我不能使用long
作为switch()部分的表达。
我不明白为什么。
这个原始人比其他人更糟?
long
出了什么问题?
答案 0 :(得分:2)
switch
适用于byte
,short
,char
和int
原始数据类型。
您无法启用long
的原因是没有必要。为了有意义地打开long
,您需要为要切换到的每个值添加case
语句。 (支持int
的唯一原因是因为这是默认的整数类型;即使对于int
来说也是一种浪费。)
答案 1 :(得分:1)
这是如何将交换机构建到Java中的。但是,你可以做的是在将它们放入切换之前将长值转换为int类型。
答案 2 :(得分:1)
有时,地图可以用作一种切换。例如:
Map<Long, Runnable> map = new HashMap<Long, Runnable>();
map.put(1L, new Runnable() { ... });
map.put(2L, new Runnable() { ... });
...
map.put(Long.MAX_VALUE, new Runnable() { ... });
map.get(someLongValue).run();
答案 3 :(得分:0)
正如其他人所说,你不能在case语句中使用long(或String等)。如果你真的想要使用long,那么显而易见的选择是使用if / then / else。
例如:
if (someValue == 1L) {
println("one");
} else if (someValue == 2L) {
println("two");
} ...
} else if (someValue == 1000L) {
println("thousand");
}
但是如果你有很多选择,那么由于你需要评估每个条件,这将表现得非常糟糕。我在其他答案中建议的是使用地图
Map<Long, Runnable> map = new HashMap<Long, Runnable>();
map.put(1L, new Runnable() {
public void run() { println("one"); }
});
map.put(2L, new Runnable() { ... });
...
map.put(1000L, new Runnable() { ... });
然后你可以使用
map.get(someValue).run();
地图版本将以恒定时间O(1)执行,而if / then / else将以线性时间O(N)执行。如您所见,此构造可以与Long,String或您喜欢的任何对象一起使用。
答案 4 :(得分:-1)