首页 > 解决方案 > 如何更改我的代码以成功执行?

问题描述

创建一个在控制台中显示文本文件内容的类,反转包含超过 3 个字符的每个单词的所有字符的大小写。单词被理解为拉丁或西里尔字符的连续序列。

输入示例:

When I was younger
So much younger
Than today
Информацию из файла
в верхний регистр

输出示例:

wHEN I was YOUNGER
So MUCH YOUNGER
tHAN TODAY
иНФОРМАЦИЮ из ФАЙЛА
в ВЕРХНИЙ РЕГИСТР

我的尝试:

    private static final String ENCODING = "CP1251";
    public static final String P13 = "(?U)(\\w{4,})";
    public static final int THREE =3;
public static String getInput(String fileName) throws IOException {
        StringBuilder sb = new StringBuilder();
        Scanner scanner = new Scanner(new File(fileName), ENCODING);
        while (scanner.hasNextLine()) {
            sb.append(scanner.nextLine()).append(System.lineSeparator());
        }
        scanner.close();
        return sb.toString().trim();
    }


    public static String convert(String text) {
        String s = text;
        StringBuffer sb = new StringBuffer();
        Pattern p = Pattern.compile(P13);
        Matcher m = p.matcher(s);
        int max = THREE;
        while (m.find()) {
            if (m.group().length() > max) {
                m.appendReplacement(sb, m.group(1).toUpperCase());
            }
        }
        return m.appendTail(sb).toString();
    }

我的输出:在此处输入图像描述

标签: javafile

解决方案


一个可能完整的实现:

  public static String convert(String text) {
    String s = text;
    StringBuffer sb = new StringBuffer();
    Pattern p = Pattern.compile(P13);
    Matcher m = p.matcher(s);
    int max = THREE;
    while (m.find()) {
      if (m.group().length() > max) {
        String replacement = transform(m.group(1));
        m.appendReplacement(sb, replacement);
      }
    }
    return m.appendTail(sb).toString();
  }

  private static String transform(String origin) {
    Character[] result = origin.chars()
        .mapToObj(i -> (char) i)
        .map(theChar -> {
          if (Character.isUpperCase(theChar)) {
            return Character.toLowerCase(theChar);
          } else {
            return Character.toUpperCase(theChar);
          }
        })
        .toArray(Character[]::new);
    return new String(ArrayUtils.toPrimitive(result));
  }

您需要学习通过断点调试代码以查看发生了什么。


推荐阅读