我的老师要求我们将一句话分成单词,但不能使用String.split()
。我已经使用Vector
(我们还没学过)、while
-循环和子字符串完成了任务。有没有其他方法可以实现这个功能?(最好不使用Vectors
/ArrayLists
)。
我相信你的老师要求你自己处理字符串(不使用任何其他库来代替你)。请确认一下是否是这种情况——如果可以使用,有一些工具可以方便地进行字符串处理,例如StringTokenizer、Pattern和Scanner。
否则...
你需要一个单词分隔符列表(例如空格、制表符、句号等),然后遍历数组,逐个字符构建字符串,直到遇到单词分隔符为止。在找到完整的单词(即遇到单词分隔符字符)后,将其保存到变量中,并重置正在构建单词的变量,然后继续进行。
Character.isWhitespace
。 - truthealitystring.split()
允许您分离使用非空格字符界定的单词,因此实现一个分隔符列表是有意义的。 - A DCharacter.isLetter
可能更容易/更好实现。 - user289086Character.isLetter
,当你遇到数字时可能会出现问题,而且在你建议将 Character.isDigit
添加到混合中之前,should_stuff_like_this_be_separated
?那么像 12,000.75 这样的带有小数点和千位分隔符的句子应该保留,但逗号和句号应该省略,对吧?我会根据任务的具体要求使用最合适的方法(这并不是非常具体)。使用字符列表比 Character.isWhitespace
更通用,但有时过于通用会导致过度杀伤力。 - truthealityString myTextToBeSplit = "This is the text to be split into words.";
StringTokenizer tokenizer = new StringTokenizer( myTextToBeSplit );
while ( tokinizer.hasMoreTokens()) {
String word = tokinizer.nextToken();
System.out.println( word ); // word you are looking in
}
Scanner s = new Scanner(myTextToBeSplit).useDelimiter("\\s");
while( s.hasNext() ) {
System.out.println(s.next());
}
s.close();
import java.util.Arrays;
public class ReverseTheWords {
public static void main(String[] args) {
String s = "hello java how do you do";
System.out.println(Arrays.toString(ReverseTheWords.split(s)));
}
public static String[] split(String s) {
int count = 0;
char[] c = s.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i] == ' ') {
count++;
}
}
String temp = "";
int k = 0;
String[] rev = new String[count + 1];
for (int i = 0; i < c.length; i++) {
if (c[i] == ' ') {
rev[k++] = temp;
temp = "";
} else
temp = temp + c[i];
}
rev[k] = temp;
return rev;
}
}
您可以使用java.util.Scanner。
在不使用Vector
/List
(也不手动重新实现它们的自我调整大小的能力)的情况下,您可以利用一个简单的观察结果:长度为N
的字符串不能超过(N+1)/2
个单词(在整数除法中)。您可以声明一个该大小的字符串数组,以与填充Vector
相同的方式填充它,然后将结果复制到您找到的单词数量大小的数组中。
所以:
String[] mySplit( String in ){
String[] bigArray = new String[ (in.length()+1)/2 ];
int numWords = 0;
// Populate bigArray with your while loop and keep
// track of the number of words
String[] result = new String[numWords];
// Copy results from bigArray to result
return result;
}
public class sha1 {
public static void main(String[] args) {
String s = "hello java how do you do";
System.out.println(Arrays.toString(sha1.split(s)));
}
public static String[] split(String s) {
int count = 0;
char[] c = s.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i] == ' ') {
count++;
}
}
String temp = "";
int k = 0;
String[] rev = new String[count + 1];
for (int i = c.length-1; i >= 0; i--) {
if (c[i] == ' ') {
rev[k++] = temp;
temp = "";
} else
temp = temp + c[i];
}
rev[k] = temp;
return rev;
}
}
或者使用一个“模式”(也称为正则表达式)来尝试匹配这些单词。
indexOf(String, int)
方法来完成某些任务。 - Flavio Cysne