检查字符串中的所有字符是否与不带循环的内置方法相同



如果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阵列中表示标记的更简单方法

相关内容

最新更新