【问题标题】:How do I output the string connected to it's Uppercase length如何输出连接到它的大写长度的字符串
【发布时间】:2020-01-28 16:46:39
【问题描述】:

在我试图创建的这个程序中,我有一个方法来获取一个字符串来计算大写字母的数量。在程序结束时,我想显示与其字符串关联的最小数量和与其字符串关联的最大数量,这是我遇到问题的地方。有没有办法以某种方式将这些连接或关联在一起?到目前为止,这是我的代码:

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;
    }

    }

【问题讨论】:

    标签: java string loops char


    【解决方案1】:

    您可以使用正则表达式来处理这个问题,如下所示:

    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;
      }
    }
    

    最后,请注意,不要在您打算保留和维护的代码中执行此操作。有很多方法可以使事情更具可读性和可维护性。例如,您可以为数据类编写实际的 getter/setter。您可以将公共数据成员设为私有以保留信息隐藏。您可以将用户输入附加到列表中,然后使用诸如 for-each 循环之类的东西来创建另一个大写大小的列表。您可以使用 for-each 循环遍历这两个列表,以创建 StringWithUppercaseSizes 的列表。您可能可以使用带有 Collectors.maxBy 的 Stream 来查找最大元素而不是排序等。

    【讨论】:

    • 哇,谢谢你解释得这么清楚。我将更多地了解它们似乎使事情变得更容易的对象。
    • 嘿,抱歉再次打扰您。由于我对对象不熟悉,因此我仍在尝试更清楚地理解它。如果可能的话,您介意解释每一行吗?
    • @Exrial 每一行是哪一部分?
    • main方法中声明int i3后的部分。我在理解数组大小时遇到​​了麻烦。 StringWithUppercaseSize[] 大小 = { new StringWithUppercaseSize(s1, i1), new StringWithUppercaseSize(s2, i2), new StringWithUppercaseSize(s3, i3) };这是一种方法吗?它有什么作用?
    • 它是一个数组初始化器。它说,“让sizes 成为一个由元素组成的新数组:一个新的 StringWithUppercaseSize 在其构造函数中采用参数 s1 和 i1,一个新的 StringWithUppercaseSize 在其构造函数中采用参数 s2 和 i2,一个新的 StringWithUppercaseSize 采用参数 s3 和 i3在它的构造函数中”。然后,Arrays.sort 根据getUppercaseLength 方法返回的值对sizes(即创建的StringWithUppercaseSizes)的内容进行排序。
    猜你喜欢
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2020-05-03
    相关资源
    最近更新 更多