比较Java中的字符
Posted
技术标签:
【中文标题】比较Java中的字符【英文标题】:Comparing chars in Java 【发布时间】:2011-06-29 09:46:06 【问题描述】:我想检查一个 char 变量是 21 个特定字符之一,我能做到这一点的最短方法是什么?
例如:
if(symbol == ('A'|'B'|'C'))
似乎没有工作。我需要这样写吗:
if(symbol == 'A' || symbol == 'B' etc.)
【问题讨论】:
是的,这是一种方式。看看regex 【参考方案1】:如果您的输入是一个字符,并且您要检查的字符大多是连续的,您可以试试这个:
if ((symbol >= 'A' && symbol <= 'Z') || symbol == '?')
// ...
但是,如果您的输入是字符串,则更紧凑的方法(但速度较慢)是使用带有字符类的正则表达式:
if (symbol.matches("[A-Z?]"))
// ...
如果您有一个字符,您首先需要将其转换为字符串,然后才能使用正则表达式:
if (Character.toString(symbol).matches("[A-Z?]"))
// ...
【讨论】:
+1 如果大多数情况下 21 个符号是连续的,我会这样做。 谢谢马克,我以前用过正则表达式,但从来没有用过 Java,甚至不知道你可以! Oracle 文档几乎总结了答案并为上述答案提供了缺陷,因此请看一下。 docs.oracle.com/javase/tutorial/i18n/text/charintro.html.【参考方案2】:是的,您需要像第二行一样编写它。 Java 没有第一行的 Python 风格语法糖。
或者,您可以将有效值放入数组中并检查数组中是否存在symbol
。
【讨论】:
【参考方案3】:伪代码,因为我没有 java sdk:
Char candidates = new Char[] 'A', 'B', ... 'G' ;
foreach(Char c in candidates)
if (symbol == c) return true;
return false;
【讨论】:
【参考方案4】:选项 2 将起作用。您也可以使用Set<Character>
或
char[] myCharSet = new char[] 'A', 'B', 'C', ...;
Arrays.sort(myCharSet);
if (Arrays.binarySearch(myCharSet, symbol) >= 0) ...
【讨论】:
【参考方案5】:您的第一条语句可能不是您想要的...'A'|'B'|'C'
实际上是在进行按位运算:)
您的第二个陈述是正确的,但您将有 21 个 OR。
如果 21 个字符是“连续的”,上述解决方案就可以了。
如果不是,您可以预先计算一组有效字符的哈希值并执行类似
的操作if (validCharHashSet.contains(symbol))...
【讨论】:
【参考方案6】:如果写成 switch 语句可能会更清楚,例如:
switch (symbol)
case 'A':
case 'B':
// Do stuff
break;
default:
【讨论】:
【参考方案7】:使用Guava:
if (CharMatcher.anyOf("ABC...").matches(symbol)) ...
或者如果其中许多字符是一个范围,例如“A”到“U”,但有些不是:
CharMatcher.inRange('A', 'U').or(CharMatcher.anyOf("1379"))
您也可以将其声明为static final
字段,这样就不必每次都创建匹配器。
private static final CharMatcher MATCHER = CharMatcher.anyOf("ABC...");
【讨论】:
【参考方案8】:如果您事先知道所有 21 个字符,则可以将它们全部写为一个字符串,然后像这样检查:
char wanted = 'x';
String candidates = "abcdefghij...";
boolean hit = candidates.indexOf(wanted) >= 0;
我认为这是最短的方法。
【讨论】:
非常优雅的解决方案。恭喜。【参考方案9】:如果你有特定的字符应该是:
Collection<Character> specificChars = Arrays.asList('A', 'D', 'E'); // more chars
char symbol = 'Y';
System.out.println(specificChars.contains(symbol)); // false
symbol = 'A';
System.out.println(specificChars.contains(symbol)); // true
【讨论】:
+1 是非常好的替代方法,这对于很多角色来说可能更好。【参考方案10】:你可以把你的字符写成字符串并使用 equals 方法。
例如:
String firstChar = "A";
String secondChar = "B";
String thirdChar = "C";
if (firstChar.equalsIgnoreCase(secondChar) ||
(firstChar.equalsIgnoreCase(thirdChar))) // As many equals as you want
System.out.println(firstChar + " is the same as " + secondChar);
else
System.out.println(firstChar + " is different than " + secondChar);
【讨论】:
【参考方案11】:你可以用这个:
if ("ABCDEFGHIJKLMNOPQRSTUVWXYZ".contains(String.valueOf(yourChar)))
请注意,您不需要使用字母 A-Z 创建单独的字符串。
【讨论】:
【参考方案12】:使用java9 中的重载便利工厂方法构造的List<Character>
的一种方法是:
if(List.of('A','B','C','D','E').contains(symbol)
// do something
【讨论】:
【参考方案13】:您可以使用 String.indexOf(char) 方法轻松解决这个问题,如果 char 不在字符串中,则返回 -1。
String candidates = "ABCDEFGHIJK";
if(candidates.indexOf(symbol) != -1)
//character in list of candidates
【讨论】:
以上是关于比较Java中的字符的主要内容,如果未能解决你的问题,请参考以下文章