我试图检查某个char
是否是元音。这样做的最佳方法是什么?
答案 0 :(得分:6)
这是我已经使用了一段时间的解决方案,它还没让我失望:
private static String VOWELS = "AÀÁÂÃÄÅĀĂĄǺȀȂẠẢẤẦẨẪẬẮẰẲẴẶḀÆǼEȄȆḔḖḘḚḜẸẺẼẾỀỂỄỆĒĔĖĘĚÈÉÊËIȈȊḬḮỈỊĨĪĬĮİÌÍÎÏIJOŒØǾȌȎṌṎṐṒỌỎỐỒỔỖỘỚỜỞỠỢŌÒÓŎŐÔÕÖUŨŪŬŮŰŲÙÚÛÜȔȖṲṴṶṸṺỤỦỨỪỬỮỰYẙỲỴỶỸŶŸÝ";
private static boolean isVowel(char c)
{
return VOWELS.indexOf(Character.toUpperCase(c)) >= 0;
}
对于我的应用程序,它的速度相当快。
答案 1 :(得分:1)
创建一个switch语句。 例如:
switch (Character.toLowerCase(foo)) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
case 'y': return true;
default: return false;
}
对于Unicode,How do I detect unicode characters in a Java string?按照此处给出的答案,然后使用我提供的switch语句。
答案 2 :(得分:1)
一种方法是使用if-else或切换案例,如@ TylerWeaver的答案。如果你想在一行中执行此操作,只需使用正则表达式
这样的事情:
对于元音:
aStr.matches("[aeiou]")
辅音:
aStr.matches("[^aeiou]")
正则表达式使生活变得非常简单,并且相当容易学习。看看这个cheatsheet。
在这种情况下,您只需创建一个范围[aeiou]
,这意味着您的角色必须与a
或e
或i
或o
或{{ 1}}。 u
是除范围内提到的字符以外的所有字符。
答案 3 :(得分:1)
我试图实现这一点,以涵盖与其中含有元音字母一样多的语言。根据我的统计,有637个Unicode字母可用于计算元音。我有一个元音类,有一个静态块,设置代表每个元音的字符串HashSet。我使用一个假设代码点(int)而不是char:
的方法public class Vowels {
public Vowels() {
}
public static Set<String> vowelStrs;
static {
vowelStrs = new HashSet<String>();
vowelStrs.add("A");
vowelStrs.add("E");
vowelStrs.add("I");
...
vowelStrs.add("\u00c4");
...
vowelStrs.add("\ua66b");
vowelStrs.add("\ua66c");
vowelStrs.add("\ua66d");
}
public boolean isMember(int inChar) {
String inStr = new String(Character.toChars(inChar));
return(Vowels.vowelStrs.contains(inStr));
}
}
答案 4 :(得分:1)
根据公认的答案,以下是最多需要2次有效表查找的解决方案:
public static boolean isVowel(char c) {
switch (c) {
case 65:
case 69:
case 73:
case 79:
case 85:
case 89:
case 97:
case 101:
case 105:
case 111:
case 117:
case 121:
case 192:
case 193:
case 194:
case 195:
case 196:
case 197:
case 198:
case 200:
case 201:
case 202:
case 203:
case 204:
case 205:
case 206:
case 207:
case 210:
case 211:
case 212:
case 213:
case 214:
case 216:
case 217:
case 218:
case 219:
case 220:
case 221:
case 224:
case 225:
case 226:
case 227:
case 228:
case 229:
case 230:
case 232:
case 233:
case 234:
case 235:
case 236:
case 237:
case 238:
case 239:
case 242:
case 243:
case 244:
case 245:
case 246:
case 248:
case 249:
case 250:
case 251:
case 252:
case 253:
case 255:
case 256:
case 257:
case 258:
case 259:
case 260:
case 261:
case 274:
case 275:
case 276:
case 277:
case 278:
case 279:
case 280:
case 281:
case 282:
case 283:
case 296:
case 297:
case 298:
case 299:
case 300:
case 301:
case 302:
case 303:
case 304:
case 305:
case 306:
case 307:
case 332:
case 333:
case 334:
case 335:
case 336:
case 337:
case 338:
case 339:
case 360:
case 361:
case 362:
case 363:
case 364:
case 365:
case 366:
case 367:
case 368:
case 369:
case 370:
case 371:
case 374:
case 375:
case 376:
case 506:
case 507:
case 508:
case 509:
case 510:
case 511:
case 512:
case 513:
case 514:
case 515:
case 516:
case 517:
case 518:
case 519:
case 520:
case 521:
case 522:
case 523:
case 524:
case 525:
case 526:
case 527:
case 532:
case 533:
case 534:
case 535:
return true;
default:
switch (c) {
case 7680:
case 7681:
case 7700:
case 7701:
case 7702:
case 7703:
case 7704:
case 7705:
case 7706:
case 7707:
case 7708:
case 7709:
case 7724:
case 7725:
case 7726:
case 7727:
case 7756:
case 7757:
case 7758:
case 7759:
case 7760:
case 7761:
case 7762:
case 7763:
case 7794:
case 7795:
case 7796:
case 7797:
case 7798:
case 7799:
case 7800:
case 7801:
case 7802:
case 7803:
case 7833:
case 7840:
case 7841:
case 7842:
case 7843:
case 7844:
case 7845:
case 7846:
case 7847:
case 7848:
case 7849:
case 7850:
case 7851:
case 7852:
case 7853:
case 7854:
case 7855:
case 7856:
case 7857:
case 7858:
case 7859:
case 7860:
case 7861:
case 7862:
case 7863:
case 7864:
case 7865:
case 7866:
case 7867:
case 7868:
case 7869:
case 7870:
case 7871:
case 7872:
case 7873:
case 7874:
case 7875:
case 7876:
case 7877:
case 7878:
case 7879:
case 7880:
case 7881:
case 7882:
case 7883:
case 7884:
case 7885:
case 7886:
case 7887:
case 7888:
case 7889:
case 7890:
case 7891:
case 7892:
case 7893:
case 7894:
case 7895:
case 7896:
case 7897:
case 7898:
case 7899:
case 7900:
case 7901:
case 7902:
case 7903:
case 7904:
case 7905:
case 7906:
case 7907:
case 7908:
case 7909:
case 7910:
case 7911:
case 7912:
case 7913:
case 7914:
case 7915:
case 7916:
case 7917:
case 7918:
case 7919:
case 7920:
case 7921:
case 7922:
case 7923:
case 7924:
case 7925:
case 7926:
case 7927:
case 7928:
case 7929:
return true;
}
}
return false;
}
嵌套开关对于保持大小写密集并生成两条恒定时间tableswitch
指令是必需的。
在535和7680之间有较大间隙的单个开关将改为生成对数时间lookupswitch
指令。