根据int子串一个String

时间:2017-06-08 07:51:57

标签: java string

我想根据我将传递给该方法的int对String进行子串。我为此使用了嵌套循环。但每次循环时我都希望只从最后一个子串子串到int,我传入方法并得到最后一个字符串。我怎样才能做到这一点?

private static void input(String s, int I)
{
    List list = new ArrayList();

    for(int a = 0; a < s.length(); a++)
    {
        for(int position = 0; position < s.length(); position++)
        {
            if(position + a + I <= s.length())
            {
                list.add(s.substring(position, position + a + I));
            }
        }
    }

}

input("abaca", 2);

预期输出:“ab”,“ac”,“a”

3 个答案:

答案 0 :(得分:2)

您不需要嵌套循环。只需迭代String一次,并在每次迭代中添加一个I字符子串。

请注意,a是当前子字符串的起始索引,因此在每次迭代中递增I

最后一个子字符串的长度可能更短。如果a + I > s.length(),则最后一个子字符串的最后一个索引将是s.length() - 1而不是a + I - 1

for(int a = 0; a < s.length(); a+=I) {
    list.add(s.substring(a, Math.min(a + I, s.length())));
}

这会产生

[ab, ac, a]

代表input("abaca", 2)

答案 1 :(得分:2)

你也可以简单地split字符串:

private static void input(String s, int i){
    List list = Arrays.asList(s.split("(?<=\\G.{"+i+"})"));
    System.out.println(list);
}

\\G表示上一场比赛结束

?<=意味着积极的背后隐藏

感谢积极的lookbehind(?<=,它将在所有零长度字符串上分割(不会切断输入字符串中的任何内容),前面是前一个匹配结束的地方({ {1}})后跟\\G个符号(i

答案 2 :(得分:0)

完全重写代码真的更好,但是如果你想保存你的结构(即使它不正确),只需删除1个循环并执行以下操作:

private static void input(String s, int I) {
    List list = new ArrayList();

    for (int position = 0; position < s.length();position += I) {
        if (position + I <= s.length()) {
            list.add(s.substring(position, position + I));
        } else {
            list.add(s.substring(position, s.length()));
            return;
        }
    }
}