我想根据我将传递给该方法的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”
答案 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;
}
}
}