Как вывести строку, связанную с ее длиной в верхнем регистре - PullRequest
0 голосов
/ 28 сентября 2019

В этой программе я пытаюсь создать, у меня есть метод, чтобы взять строку для подсчета количества заглавных букв.В конце программы я хочу показать наименьшее количество, связанное с его строкой, и максимальное количество, связанное с ее строкой, где у меня возникают проблемы.Есть ли способ как-то связать или связать их вместе?Вот мой код:

import java.util.Scanner;
import java.util.Arrays;
public class test {
    public static void main(String[] args) {
        System.out.println("Please input a string:");
        Scanner input = new Scanner(System.in);
        String s1 = input.nextLine();
        String s2 = input.nextLine();
        String s3 = input.nextLine();
        int i1 = sumLetter(s1);
        int i2 = sumLetter(s2);
        int i3 = sumLetter(s3);


        int[] array = new int[3];
        array[0] = i1;
        array[1] = i2;
        array[2] = i3;
        Arrays.sort(array);

        System.out.println(s1 + " has a maximum number of uppercase: "+ array[2]);
        System.out.println(s3 + " has a maximum number of uppercase: "+ array[0]);


    }
    public static int sumLetter(String m) {
        int count = 0;
        for(int i = 0; i < m.length();i++) {
            if(Character.isUpperCase(m.charAt(i)))
                count++;
        }
        return count;
    }

    }

1 Ответ

0 голосов
/ 28 сентября 2019

Вы можете использовать регулярные выражения для обработки, например, так:

public static void main(String[] args) {
  String str = "This string has FIVE uppercase characters within itself.";
  System.out.println(str.replaceAll("[^\\p{javaUpperCase}]","").length());
}

Вывод:

5

Это примерно эквивалентно следующему:

public static void main(String[] args) {
  String str = "This string has FIVE uppercase characters within itself.";
  int uppercases = 0;
  for(char c : str.toCharArray()) {
    uppercases += Character.isUpperCase(c) ? 1 : 0;
  }
  System.out.println(uppercases);
}

Вывод:

5

Теперь, при условии, что у вас есть эта функциональность (что вы делаете) в некотором методе:

public static int sumLetter(String m) { ... }

Вы хотите связать строку с длиной в верхнем регистре.Создайте простой класс данных:

final class StringWithUppercaseSize {
  public final String string;
  public final int uppercaseLength;

  public StringWithUppercaseSize(String string, int uppercaseLength) {
    this.string = string;
    this.uppercaseLength = uppercaseLength;
  }

  public int getUppercaseLength() {
    return this.uppercaseLength;
  }
}

Теперь вы создаете массив из следующих объектов:

Scanner input = new Scanner(System.in);
String s1 = input.nextLine();
String s2 = input.nextLine();
String s3 = input.nextLine();
int i1 = sumLetter(s1);
int i2 = sumLetter(s2);
int i3 = sumLetter(s3);
StringWithUppercaseSize[] sizes = { new StringWithUppercaseSize(s1, i1), new StringWithUppercaseSize(s2, i2), new StringWithUppercaseSize(s3, i3) };

Сортировка массива по верхнему размеру:

Arrays.sort(sizes, Comparator.comparing(StringWithUppercaseSize::getUppercaseLength));

Выведите минимальную / максимальную заглавную строку / длины:

System.out.println(sizes[0].string + " has a minimum number of uppercase: "+ sizes[0].uppercaseLength);
System.out.println(sizes[2].string + " has a maximum number of uppercase: "+ sizes[2].uppercaseLength);

Ввод:

Abc
abc
aBC

Вывод:

abc has a minimum number of uppercase: 0
aBC has a maximum number of uppercase: 2

Вот мой полный тестовый код:

Main.java

class Main {
public static void main(String[] args) {
        System.out.println("Please input a string:");
        Scanner input = new Scanner(System.in);
        String s1 = input.nextLine();
        String s2 = input.nextLine();
        String s3 = input.nextLine();
        int i1 = sumLetter(s1);
        int i2 = sumLetter(s2);
        int i3 = sumLetter(s3);
        StringWithUppercaseSize[] sizes = { new StringWithUppercaseSize(s1, i1), new StringWithUppercaseSize(s2, i2), new StringWithUppercaseSize(s3, i3) };
        Arrays.sort(sizes, Comparator.comparing(StringWithUppercaseSize::getUppercaseLength));
        System.out.println(sizes[0].string + " has a minimum number of uppercase: "+ sizes[0].uppercaseLength);
        System.out.println(sizes[2].string + " has a maximum number of uppercase: "+ sizes[2].uppercaseLength);
    }
    public static int sumLetter(String m) {
        int count = 0;
        for(int i = 0; i < m.length();i++) {
            if(Character.isUpperCase(m.charAt(i)))
                count++;
        }
        return count;
    }
}

StringWithUppercaseSize.java

final class StringWithUppercaseSize {
  public final String string;
  public final int uppercaseLength;

  public StringWithUppercaseSize(String string, int uppercaseLength) {
    this.string = string;
    this.uppercaseLength = uppercaseLength;
  }

  public int getUppercaseLength() {
    return this.uppercaseLength;
  }
}

Наконец, как примечание, не делайте это в коде, который вы намереваетесь хранить и поддерживать.Есть много способов сделать вещи более читабельными и понятными.Например, вы можете написать фактические методы получения / установки для вашего класса данных.Вы можете сделать общедоступные элементы данных закрытыми, чтобы сохранить скрытую информацию.Вы можете добавить пользовательские входные данные в список, а затем использовать такие вещи, как цикл for-each, чтобы создать еще один список в верхнем регистре.Вы можете просмотреть оба этих списка с помощью цикла for-each, чтобы создать список из StringWithUppercaseSize s.Вероятно, вы можете использовать Stream с Collectors.maxBy, чтобы найти максимальное количество элементов вместо сортировки и т. Д.

...