#java #string #percentage #uppercase
#java #строка #процент #верхний регистр
Вопрос:
Мой вопрос прост: как проверить, содержит ли строка более 60% прописных букв?
Комментарии:
1. С помощью цикла и использования
myString.charAt()
2. Пожалуйста, покажите код, который у вас уже есть, и сообщите нам, какие у вас проблемы.
Ответ №1:
Выполните итерацию по строке и посчитайте каждый символ верхнего регистра. Затем разделите это значение на длину строки.
Комментарии:
1. В целом это правильный подход, хотя AIUI, определяющий «прописные буквы», может усложниться, если вы выходите за рамки обычных алфавитов.
2. Что делать, если в строке есть пробелы? Что, если она содержит символы нелатинского алфавита?
3. Возможно, вам потребуется также подсчитать символы нижнего регистра, в зависимости от того, как вы определяете 60%. Это 60% всех символов или 60% буквенных символов. Если последнее, то процент будет #upper / (#upper #lower)
4. @blgt Человек, пишущий код, должен решить — или уточнить — правила для себя на этом этапе. Они не рассматриваются в вопросе (потому что это довольно низкое качество).
5. этот ответ настолько же точен, насколько и вопрос, правильный подход
Ответ №2:
Попробуйте:
int uppers = 0;
for(char c : s.toCharArray()) {
if(Character.isUpperCase(c)) {
uppers;
}
}
double pct = (uppers * 1D) / (s.length() * 1D) * 100D;
if(pct > 60D) {
// do somnething
}
Ответ №3:
Попробуйте это
String test="AvCFrB";
char[] arr = test.toCharArray();
int count = 0;
for (int i = 0; i < arr.length; i ) {
boolean upperCase = Character.isUpperCase(arr[i]);
System.out.println(arr[i] "=" upperCase);
if(upperCase)
count ;
}
double percentage = (count*1.0/test.length()*1.0)*100;
System.out.println(percentage);
Вывод-
A=true
v=false
C=true
F=true
r=false
B=true
66.66666666666666
Ответ №4:
Он полностью основан на программировании и математике. Будет лучше, если вы запрограммируете это самостоятельно. Однако вы можете следовать приведенному ниже процессу.
- получить размер строки
- проверьте все символы строки
- подсчитайте каждый верхний регистр
- примените формулу (100* total_uppercharecters)/string _size
Ответ №5:
Что-то подобное должно это сделать. Вообще не тестировалось.
public boolean getPercentUpperCase(String str, int morethenpercent) {
int lowercaseChars = 0, uppercaseChars = 0;
for (int i = 0; i >= str.length() -1; i ) {
if (Character.isUpperCase(str.charAt(i))) {
uppercaseChars ;
} else {
lowercaseChars ;
}
}
return (Math.round(uppercaseChars / lowercaseChars) > morethenpercent);
}
Комментарии:
1. Вы можете улучшить это, используя a
while
, который остановится, когдаuppercaseChars
будет большеstr.length * 0.6
(а также может остановиться после итерации по всем). И вам не нужны символы нижнего регистра, поскольку символы нижнего регистра должны рассматриваться какstr.length - uppercaseChars
.2. Я не уверен, действительно ли это улучшение вычисляется каждый раз, если оно выше, вместо того, чтобы считать, если оно прописное
3. Это будет улучшением. Но незначительно, поскольку, я думаю, его строка не будет гигантской строкой.
4. Но почему
i--
? Это не имеет смысла!5. не имеет значения, увеличивается или уменьшается. в любом случае, изменил его.
Ответ №6:
Я даю свое решение прямо здесь, которое выглядит как какое-то другое, но, как мне кажется, с некоторыми улучшениями. Вы можете попробовать мое решение здесь: https://ideone.com/KGmMDa .
Обратите внимание, что я использую while
цикл, так как мне не нравится break
:
int upCount = 0;
int index = 0;
double percentLimit = str.length() * 0.6;
boolean upper = false;
while (!upper amp;amp; (index < str.length())) {
if(Character.isUpperCase(str.charAt(index))) {
upCount ;
upper = upCount >= percentLimit;
}
index ;
}
return upper;
Гррр, вот с for
и break
, но я ненавижу break
: (
int upCount = 0;
double percentLimit = str.length() * 0.6;
for (char c : str.toCharArray()) {
if(Character.isUpperCase(c)) {
upCount ;
if (upCount >= percentLimit) {
break;
}
}
}
return (upCount >= percentLimit);
Ответ №7:
Вы также можете использовать stream API в java 8 для достижения этой цели.
public class Test {
public static void main(String[] args){
System.out.println(is60PercentUpper("aBc GH")); //true
}
public static boolean is60PercentUpper(String s){
return s.chars()
.filter(Character::isLetter)
.map(entry -> Character.isUpperCase(entry) ? 1 : 0)
.summaryStatistics()
.getAverage() >= 0.60;
}
}
Что он делает, так это:
- получите поток символов из строки
- фильтруйте каждый символ, чтобы получать только буквы
- сопоставьте каждое значение символа с 1, если оно в верхнем регистре, в противном случае 0
- получите сводную статистику и проверьте, превышает ли среднее значение или равно 60%