Java 查找字符串中的第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

我想在字符串中找到第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++){
     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;