使用Java switch case时,它只接受char和int,但我想提供字符串大小写。如何做到这一点?
答案 0 :(得分:6)
你不能在交换机案例中使用字符串。 It's on its way in Java 7.
它接受的当前类型包括char
,byte
,short
,int
,Character
,Byte
,{{1} },Short
或枚举类型。
来自Java语言规范:
Expression的类型必须是char,byte,short,int,Character,Byte,Short,Integer或枚举类型(第8.9节),否则会发生编译时错误。
...
以下所有内容必须为true,否则将导致编译时错误:
- 与switch语句关联的每个case常量表达式必须可分配(第5.2节)到switch表达式的类型。
- 没有开关标签为空。
- 与switch语句关联的两个case常量表达式中没有两个可能具有相同的值。
- 最多一个默认标签可能与同一个switch语句相关联。
答案 1 :(得分:3)
正如其他回复所述,Java(当前)不支持切换字符串值。有三种常用的方法可以达到同样的效果:
将switch
替换为if ... else if ...
个语句链。 (呸)。
创建并填充HashMap,将字符串映射为整数代码,然后打开代码。
定义enum
类型,其值的名称与字符串相同,使用EType.valueOf(String)将字符串映射到枚举值,然后打开枚举值。 (如果要求遵守枚举值的Java标识符样式规则,或者字符串包含非标识符字符,则可能会更复杂。)
@Pete Kirkham添加了切换字符串哈希码的“经典黑客”。但是,有一些问题:
它没有正确处理提供的字符串不是必需字符串之一的情况。 (想一想:许多字符串都散列为相同的哈希码。)
哈希码很可能是间隔很大的,因此JIT编译器必须根据哈希码值将交换机编译为一系列测试/分支。这比基于String.equals()
的测试/分支更快,但对于编译为跳转表的开关,它是O(N)
...而不是O(1)
。
答案 2 :(得分:2)
从Java 6开始,您只能打开以下类型:
JLS 14.11 The
switch
statementSwitchStatement: switch ( Expression ) SwitchBlock
Expression
的类型必须是char
,byte
,short
,int
,Character
,Byte
,Short
,Integer
或enum
类型,或发生编译时错误。 [...]与switch语句关联的每个case
常量表达式必须可分配给switch Expression
的类型。
根据您的使用情况,您可以使用enum
代替String
。与String
不同,您可以启用enum
。这是一个例子:
public class EnumSwitchSample {
static enum Color {
BLACK, WHITE;
}
public static void main(String[] args) {
test(Color.valueOf("BLACK"));
// "It's black!"
test(Color.WHITE);
// "It's white!"
}
static void test(Color c) {
switch (c) {
case BLACK:
System.out.println("It's black!");
break;
case WHITE:
System.out.println("It's white!");
break;
}
}
}
但是,Java中的enum
实际上非常强大,您甚至可能不需要switch
。这是一个例子:
public class EnumMemberExample {
static enum Mood {
SCREAM("I'M LOUD AND OBNOXIOUS!!!") {
@Override public String say(String statement) {
return statement.toUpperCase().replaceAll("!", "!!!");
}
},
WHISPER("Ssh... Be vewy vewy quiet...") {
@Override public String say(String statement) {
return statement.toLowerCase().replaceAll("!", "...");
}
};
final String msg;
Mood(String msg) { this.msg = msg; }
String getMessage() { return msg; }
abstract String say(String statement);
}
public static void main(String[] args) {
test(Mood.SCREAM);
// "I'M LOUD AND OBNOXIOUS!!!"
// "HELLO!!! HOW ARE YOU!!!"
test(Mood.WHISPER);
// "Ssh... Be vewy vewy quiet..."
// "hello... how are you..."
}
static void test(Mood m) {
System.out.println(m.getMessage());
System.out.println(m.say("Hello! How are you!"));
}
}
答案 3 :(得分:1)
switch-case
是一种语言结构,旨在仅接受整数值。你不能改变它的工作方式。
答案 4 :(得分:0)
我真的很绝望你可以打开String的摘要。如果你是那种东西的话。
import java.util.zip.Adler32;
public class StringSwitch {
public static void main(String[] args) {
String arg;
if (args == null || args.length == 0) {
arg = "stackoverflow";
} else {
arg = args[0];
}
Adler32 algorithm = new Adler32();
algorithm.update(arg.getBytes());
int hash = (int) algorithm.getValue();
switch (hash) {
case 647693707:
System.out.println("Programming Q & A");
break;
case 145556093:
System.out.println("Narwhals and bacon");
break;
case 193790704:
System.out.println("How do they work?");
break;
}
}
}
答案 5 :(得分:0)
让我戴上我的教条帽(你用Java编写代码,所以我假设你关心OOP)
而不是问:我该怎么做错事?而是问:什么是正确的事情?在这种情况下:http://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html 并进行一些讨论:http://www.c2.com/cgi/wiki?ReplaceConditionalWithPolymorphism