owc*_*wca 5 java string split tokenize
我对如何完成这项任务有一些基本的想法,但我不确定我是否做得对.所以我们上课了WindyString with metod blow.使用后:
System.out.println(WindyString.blow(
"Abrakadabra! The second chance to pass has already BEGUN! "));
Run Code Online (Sandbox Code Playgroud)
我们应该得到这样的东西:
e a e a a ea y
br k d br ! Th s c nd ch nc t p ss h s lr d B G N!
A a a a a e o o a E U
Run Code Online (Sandbox Code Playgroud)
所以简而言之,在每个第二个单词中,我们选择每个元音并将它们移动到上面一行.在下半部分的单词中,我们将元音移到下面一行.
我知道我应该使用tokenizer或split方法将字符串拆分为令牌,但下一步是什么?创建3个数组,每个数组代表每行?
是的,这可能是解决问题的一种简单(不是非常高效)的方式.
创建3个数组; 一个填充实际数据,两个数组填充(Arrays.fill)' '.
然后遍历包含实际数据的数组,并保留当前所在单词的整数,如果已匹配空格,则保留布尔值.
迭代时,检查字符是否为元音.如果是元音,请检查字数(奇数/均匀度)并将其放在第一个或第三个数组中.到达空格时,设置布尔值并增加字数.如果到达另一个空格,请检查是否已设置空格:如果是,请继续.如果匹配非空格,请重置空格布尔值.
然后将所有数组连接在一起,并在每个连接的数组之间附加一个换行符并返回该字符串.
最简单的方法是使用正则表达式。这应该是有启发性的:
static String blow(String s) {
String vowels = "aeiouAEIOU";
String middle = s.replaceAll("[" + vowels + "]", " ");
int flip = 0;
String[] side = { "", "" };
Scanner sc = new Scanner(s);
for (String word; (word = sc.findInLine("\\s*\\S*")) != null; ) {
side[flip] += word.replaceAll(".", " ");
side[1-flip] += word.replaceAll("[^" + vowels + "]", " ");
flip = 1-flip;
}
return String.format("|%s|%n|%s|%n|%s|", side[0], middle, side[1]);
}
Run Code Online (Sandbox Code Playgroud)
我|在输出中添加了字符,以表明它正确处理了多余的空格 - 所有三行都保证相同的长度,处理前导空格、尾随空格,甚至所有空格输入。
如果您不熟悉正则表达式,这绝对是一个很好的学习起点。
这middle只是原始字符串,所有元音都替换为空格。
那么,side[0]和side[1]分别是顶线和底线。我们使用Scanner来提取每个单词(保留前导空格和尾随空格)。我们处理每个单词的方式是,一侧全部用空格代替;另一侧全部用空格代替。在另一种情况下,只有非元音被空格替换。我们处理的每一个字都会翻转立场。