如果String
中的所有字符都相同,那么如何使用内置方法构建返回TRUE
的Java方法,而不使用Regex、循环或递归?
示例:
aaaaaa --> True
abaaaa --> False
Aaaaaa --> False
您可以使用.chars()
将字符串转换为IntStream
,并使用.distinct().count() == 1
检查流是否具有1的不同计数。
String s = "aaaaaa";
boolean isAllCharsSame = s.chars().distinct().count() == 1;
如果字符串s
中的所有字符都相同,则isAllCharsSame
将为true
,否则为false
。
编辑:
String s = "aaaaaa";
boolean isAllCharsSame = s.codePoints().distinct().count() == 1;
.chars()
不适用于像"👋👋👋"
这样的Unicode代码点,请使用.codePoints()
。感谢@BasilBourque指出这一点。
tl;dr
if ( "👋👋👋".codePoints().distinct().count() == 1 ) { … }
代码点,而不是char
其他一些答案使用char
。不幸的是,char
类型已经过时,甚至不能表示Unicode中143859个字符中的一半。只需尝试使用字符串"👋👋👋"
而不是"aaa"
。
而是使用代码点整数。
Set < Integer > codePointsDistinct = "aaaaaaa".codePoints().boxed().collect( Collectors.toSet());
boolean allSameCharacter = ( codePointsDistinct.size() == 1 ) ;
请在IdeOne.com上查看实时运行的代码。
真实
我们可以通过调用.distinct()
来要求流消除重复,从而使其更加简短。
boolean allSameCharacter = ( "👋👋👋".codePoints().distinct().count() == 1 );
您可以使用String.replaceAll()
String s = "aaaaaaa";
boolean same = s.replaceAll("" + s.charAt(0), "").length() == 0;
您可以使用递归在根本不需要循环的情况下完成此操作。这很糟糕,但有可能:
boolean singleChar(String s) {
// Add check to make sure there is at least one char.
char first = s.charAt(0);
return singleCharRecursive(first, 1, s);
}
boolean singleCharRecursive(char first, int idx, String s) {
return idx >= s.length()
|| (s.charAt(idx) == first && singleCharRecursive (first, idx+1, s));
}
这是的另一个答案
我相信可能还有另一个选项可以分析字符串中的第一个字符,看看它们是否都匹配,但这个选项有效。
String t = "aaa";
char c = t.charAt(0);
long cnt = t.chars().filter(ch -> ch == c).count();
System.out.println(cnt==t.length());
您可以使用replace
方法:
boolean r = "aaaaaaa".replace("a", "").length() == 0;
System.out.println(r); // true
另请参阅:在2D阵列中表示标记的更简单方法