有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在特定位置向字符数组添加内容(Java)

我的任务是使用一个用户句子,然后用大写字母分隔,并在添加" "后用小写字母分隔
我想添加一个空格来添加该位置,这样如果用户输入"HappyDaysToCome"将输出"Happy days to come"

当前代码

  public static void main(String[] args)
  {
    Scanner s = new Scanner(System.in);
    System.out.println("Please enter a sentence");
    String sentenceString = s.nextLine();
    char[] sentenceArray = sentenceString.toCharArray();
    for(int i = 0; i < sentenceArray.length; i++)
    {
        if(i!=0 && Character.isUpperCase(sentenceArray[i]))
        {
            Character.toLowerCase(sentenceArray[i]); 
            sentenceArray.add(i, ' ');    
        }

    }
    System.out.println(sentenceArray)
    s.close();
  }
}

共 (3) 个答案

  1. # 1 楼答案

    我们基本上希望将输入字符串标记为大写字母。这可以使用正则表达式[A-Z][^A-Z]*(即一个大写字母,后跟零个或多个“not”大写字母)来实现。String类有一个内置的split()方法,该方法采用正则表达式。不幸的是,您还希望保留分隔符(大写字母),这样会稍微复杂一些,但仍然可以使用PatternMatcher将匹配的分隔符放回字符串中:

    import java.util.StringTokenizer;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import java.util.List;
    import java.util.ArrayList;
    public class Foo {
      public static void main(String[] args) {
        String text = "ThisIsATest1234ABC";
        String regex = "\\p{javaUpperCase}[^\\p{javaUpperCase}]*";
        Matcher matcher = Pattern.compile(regex).matcher(text);
        StringBuffer buf = new StringBuffer();
        List<String> result = new ArrayList<String>();
        while(matcher.find()){
            matcher.appendReplacement(buf, matcher.group());
            result.add(buf.toString());
            buf.setLength(0);
        }   
    
        matcher.appendTail(buf);
        result.add(buf.toString());
        String resultString = ""; 
        for(String s: result) { resultString += s + " "; }
        System.out.println("Final: \"" + resultString.trim() + "\"");
      }
    }
    

    输出:

    Final: "This Is A Test1234 A B C"
    
  2. # 2 楼答案

    你走错路了。只需将每个字符添加回一个新字符串,但在正确的位置包含空格。根本不用担心修改字符数组。下面是对您的代码的轻微修改:

      public static void main(String[] args)
      {
        Scanner s = new Scanner(System.in);
        System.out.println("Please enter a sentence");
        String sentenceString = s.nextLine();
        char[] sentenceArray = sentenceString.toCharArray();
    
        //new string to hold the output
        //starts with only the first char of the old string
        string spacedString = sentenceArray[0] + "";
    
        for(int i = 1; i < sentenceArray.length; i++)
        {
          if(Character.isUpperCase(sentenceArray[i]))
          {
            //if we find an upper case char, add a space and the lower case of that char
            spacedString = spacedString + " " + Character.toLowerCase(sentenceArray[i]);    
          }else {
            //otherwise just add the char itself
            spacedString = spacedString + sentenceArray[i];
          }
        }
    
        System.out.println(spacedString)
        s.close();
      }
    

    如果想要优化性能,可以使用StringBuilder对象。然而,对于一个句子的间隔,性能根本不会产生任何真正的影响。如果性能对你来说很重要,请阅读更多关于StringBuilder的内容:

  3. # 3 楼答案

    数组没有add方法。数组不可调整大小。如果您确实想使用char[]数组,则需要分配一个足够大的数组,例如,通过计算大写字母或简单地分配一个肯定足够大的数组(两倍String长度减去1)

    String input = ...
    
    String outputString;
    
    if (input.isEmpty()) {
        outputString = "";
    } else {
        char[] output = new char[input.length() * 2 - 1];
        output[0] = input.charAt(0);
        int outputIndex = 1;
        for (int i = 1; i < input.length(); i++, outputIndex++) {
            char c = input.charAt(i);
            if (Character.isUpperCase(c)) {
                output[outputIndex++] = ' ';
                output[outputIndex] = Character.toLowerCase(c);
            } else {
                output[outputIndex] = c;
            }
        }
        outputString = new String(output, 0, outputIndex);
    }
    
    System.out.println(outputString);
    

    或者最好还是用StringBuilder

    String input = ...
    
    String outputString;
    
    if (input.isEmpty()) {
        outputString = "";
    } else {
        StringBuilder sb = new StringBuilder().append(input.charAt(0));
    
        for (int i = 1; i < input.length(); i++) {
            char c = input.charAt(i);
            if (Character.isUpperCase(c)) {
                sb.append(' ').append(Character.toLowerCase(c));
            } else {
                sb.append(c);
            }
        }
        outputString = sb.toString();
    }
    
    System.out.println(outputString);