【问题标题】:Given a string/text, how can I take each following pair of letters from the given string/text? [closed]给定一个字符串/文本,我如何从给定的字符串/文本中获取每对字母? [关闭]
【发布时间】:2021-02-14 23:53:13
【问题描述】:

给定一个字符串,我如何获取每对字母?

这里是一个例子,给定 string = "asdfg",代码输出 arr[as,df,g_]; 给定 string = "asdfgghk",代码输出 arr[as,df,gg,hk]。

如果字符串长度是奇数,那么最后一对将是 char[i]_,(下划线)

这是我写的部分代码:


    public static char
    getCharFromString(String s, int index) 
    { 
        return s.charAt(index); 
    } 
    public static String[] solution(String s) {
        char a, b;
        String[] arr = new String[(s.length() / 2)];
        for(int i = 0; i < s.length(); i+=2) {
            if(s.length() % 2 == 0) {
                 a = getCharFromString(s, i);
                 b = getCharFromString(s, i + 1);
                arr[i] = a + b ;
            }
            else {
                a = getCharFromString(s, i);
                b = getCharFromString(s, i + 1);
                arr[i] = a + b ;
                if(i == s.length()) {
                    b = "_";
                }   
            }
        }
        return arr;
    }

【问题讨论】:

  • 欢迎来到 Stack Overflow!请阅读“如何创建minimal reproducible example”。然后使用edit 链接改进您的问题(不要通过 cmets 添加更多信息)。否则我们无法回答您的问题并为您提供帮助。含义:不要只给我们您的任务和您当前的代码。不要指望我们首先弄清楚你的代码当前在做什么,然后找出它到底哪里错并导致错误的输出。
  • 和无关的:了解 java 命名约定。类名总是大写。您在代码中使用的名称应该是有意义的。 “代码”不会告诉您该类应该做什么,而 s, a, b, ... 不会告诉您关于变量的用途。仅对循环索引使用单个字符名称,其他任何内容都应该使用更冗长的名称!

标签: java arrays string letter


【解决方案1】:

使用正则表达式非常容易。只需将字符串每隔 2 个字符拆分一次,如果数组的最后一个元素缺少一个字符,请将 _ 附加到它。

演示:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(Arrays.toString(solution("asdfg")));
        System.out.println(Arrays.toString(solution("asdfgghk")));
    }

    public static String[] solution(String s) {
        // Split the string on every 2 characters
        String[] arr = s.split("(?<=\\G..)");

        // If the last element of the array is short of one character, append '_' to it
        if (arr.length > 1 && arr[arr.length - 1].length() != 2) {
            arr[arr.length - 1] += "_";
        }
        return arr;
    }
}

输出:

[as, df, g_]
[as, df, gg, hk]

注意:正则表达式(?&lt;=\\G..)已在下面解释:

  1. \G 断言位置在上一个匹配的结尾或第一个匹配的字符串的开头
  2. . 匹配任何字符(行终止符除外)

【讨论】:

    【解决方案2】:

    众多解决方案之一:

    public static String[] solution(String s) {
        int arrayLen = s.isEmpty() ? 1 : (int) Math.ceil(s.length() / 2.0);
        String[] arr = new String[arrayLen];
    
        for (int i = 0; i < arrayLen; i++) {
            arr[i] = s.substring(Math.min(s.length(), i * 2), Math.min(s.length(), i * 2 + 2));
        }
        if (arr[arrayLen - 1].length() == 1) {
            arr[arrayLen - 1] = arr[arrayLen - 1] + "_";
        } else if (arr[arrayLen - 1].isEmpty()){
            arr[arrayLen - 1] = "__";
        }
    
        return arr;
    }
    

    【讨论】:

    • 这仅在其入站时有效-这里是一个错误 java.lang.ArrayIndexOutOfBoundsException: -1
    • 我编辑了我的解决方案,请检查。现在正在处理空字符串。
    猜你喜欢
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多