Java 查找字符串中的第n个单词
我想在字符串中找到第n个单词。我不允许使用Java 查找字符串中的第n个单词,java,Java,我想在字符串中找到第n个单词。我不允许使用String类中的StringToknizer或split方法 我现在意识到我可以使用空白作为分隔符。唯一的问题是我不知道如何找到第一个空白的位置 public static String pick(String message, int number){ String lastWord; int word = 1; String result = "haha"; for(int i=0; i<message.length();i
String
类中的StringToknizer
或split
方法
我现在意识到我可以使用空白作为分隔符。唯一的问题是我不知道如何找到第一个空白的位置
public static String pick(String message, int number){
String lastWord;
int word = 1;
String result = "haha";
for(int i=0; i<message.length();i++){
if(message.charAt(i)==' '){enter code here
word++;
}
}
if(number<=word && number > 0 && number != 1){//Confused..
int space = message.indexOf(" ");//improve
int nextSpace = message.indexOf(" ", space + 1);//also check dat
result = message.substring(space,message.indexOf(' ', space + 1));
}
if(number == 1){
result = message.substring(0,message.indexOf(" "));
}
if(number>word){
lastWord = message.substring(message.lastIndexOf(" ")+1);
return lastWord;
}
else return result;
}
公共静态字符串选取(字符串消息,整数){
字符串最后一个字;
int-word=1;
字符串结果=“哈哈”;
用于(int i=0;iword){
lastWord=message.substring(message.lastIndexOf(“”+1);
返回最后一个字;
}
否则返回结果;
}
欺骗(使用正则表达式)1
试验
输出
这个
A.
无效的
1) 只有
StringTokenizer
和split
是不允许的;-) 当前的实现过于复杂,难以理解
考虑以下替代算法:
- 初始化
,以跟踪您在输入字符串中的位置index=0
- 重复n-1次:
- 跳过非空格字符
- 跳过空格字符
- 此时您位于第n个单词的开头,请将其保存到
start
- 跳过非空格字符
- 此时,您刚好位于第n个单词的末尾
- 返回起始和结束之间的子字符串
public static String pick(String message, int n) {
int index = 0;
for (int i = 1; i < n; i++) {
while (index < message.length() && message.charAt(index) != ' ') index++;
while (index < message.length() && message.charAt(index) == ' ') index++;
}
int start = index;
while (index < message.length() && message.charAt(index) != ' ') index++;
return message.substring(start, index);
}
公共静态字符串选取(字符串消息,int n){
int指数=0;
对于(int i=1;i
请注意,如果n
高于输入中的单词,
这将返回空字符串。
(如果这不是您想要的,应该很容易调整。)这需要一些边缘大小写处理(例如,少于n个单词),但我的想法是这样的。这与您的解决方案类似,但我没有janos的优雅
public static String pick(String message, int n) {
int wordCount = 0;
String word = "";
int wordBegin = 0;
int wordEnd = message.indexOf(' ');
while (wordEnd >= 0 && wordCount < n) {
word = message.substring(wordBegin, wordEnd).trim();
message = message.substring(wordEnd).trim();
wordEnd = message.indexOf(' ');
wordCount++;
}
if (wordEnd == -1 && wordCount + 1 == n) {
return message;
}
if (wordCount + 1 < n) {
return "Not enough words to satisfy";
}
return word;
}
公共静态字符串选取(字符串消息,int n){
int字数=0;
字串=”;
int-wordBegin=0;
int-wordEnd=message.indexOf(“”);
while(wordEnd>=0&&wordCount
现在,Java中的大多数迭代都可以被流取代。这是否是一种进步是(强烈的)意见问题
您需要在空格处拆分还是在空格处拆分?前者不仅仅是后者。如果只是后者,
indexOf
就可以了。你很接近了。尝试一个“while”循环,检查字数和一个正的“indexOf”返回值。您可以使用子字符串来保留您在输入字符串中的位置。@Lothar您可以假定输入中的每个空格都是单词之间的过渡。(Project)@Mike抱歉,我没有听清楚您的意思:(好的,正如@Mike所说;-)否则你需要正则表达式。不允许内置类和方法有点奇怪。为什么他们不提出一个问题,这个问题的问题空间与内置的问题空间相同,我的教授并没有走那么远。我们仍然在做数组:(但我想知道这是件好事。不过,谢谢你!@Andreas确实是这样:):)很抱歉这个“迟到”的评论。我燃烧我的脑细胞去理解它。谢谢你,先生!我认为修剪与空白有关。这是从我在谷歌的经历中得到的。:)你说得对。这有点懒惰,但因为我们正在寻找一个空间来标识单词的开头/结尾,所以在获取子字符串时,使用trim()删除结果空间比从结果的索引中加/减1更容易。
public static String pick(String message, int n) {
int index = 0;
for (int i = 1; i < n; i++) {
while (index < message.length() && message.charAt(index) != ' ') index++;
while (index < message.length() && message.charAt(index) == ' ') index++;
}
int start = index;
while (index < message.length() && message.charAt(index) != ' ') index++;
return message.substring(start, index);
}
public static String pick(String message, int n) {
int wordCount = 0;
String word = "";
int wordBegin = 0;
int wordEnd = message.indexOf(' ');
while (wordEnd >= 0 && wordCount < n) {
word = message.substring(wordBegin, wordEnd).trim();
message = message.substring(wordEnd).trim();
wordEnd = message.indexOf(' ');
wordCount++;
}
if (wordEnd == -1 && wordCount + 1 == n) {
return message;
}
if (wordCount + 1 < n) {
return "Not enough words to satisfy";
}
return word;
}
int thirdWordIndex = IntStream.range(0, message.size() - 1)
.filter(i -> Character.isWhiteSpace(message.charAt(i)))
.filter(i -> Character.isLetter(message.charAt(i + 1)))
.skip(2).findFirst()
.orElseThrow(IllegalArgumentException::new) + 1;