Проверьте, не содержит ли строка более 60% прописных букв

#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:

Он полностью основан на программировании и математике. Будет лучше, если вы запрограммируете это самостоятельно. Однако вы можете следовать приведенному ниже процессу.

  1. получить размер строки
  2. проверьте все символы строки
  3. подсчитайте каждый верхний регистр
  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%