只收集第一个索引

时间:2019-09-28 03:20:05

标签: java arrays

因此,我应该制作一个包含字符的列表,该字符跟随文本中每个非尾部出现的模式。列表索引n中存储的字符必须是模式的第n次非尾部出现之后的字符。

例如:测试用例getCharsThatFollowPattern(“ abcabdabcab”,“ ab”)应该返回ArrayList ['c','d','c']。

我在尝试使列表遍历模式文本时遇到问题。我在测试用例中得到了['a','a','a']而不是['c','d','c']。

public static ArrayList<Character> getCharsThatFollowPattern (String text, String pattern) { 

  ArrayList<Character> character = new ArrayList<Character>(); 
  int i = 0; 

  while (i < text.length()) 
  { 
    if (i < text.length()) 
    { 
      character.add(text.charAt(text.indexOf(pattern, i))); 
      i = i + text.indexOf(pattern, i) + pattern.length(); 
    } 
  } 

  return character;
}

为什么不迭代呢? :(

1 个答案:

答案 0 :(得分:1)

您的目的是在较大的text值中找到一个子字符串模式,然后将每个这些字符添加到数组中。您的代码中发生了一些事情,因此,我尝试创建一个最简单的示例,说明如何使其工作,但排除了您本来可以做的事情(例如创建数组和填充值)。

下面的代码查找下一个模式的起始位置– indexOfNextPatternStart –以后将发生“ ab”的位置。然后,它加上“ ab”本身的长度,以得到之后的索引。因此,在您的text示例中,它以"abc"开头–“ ab”显然在最前面,但是您希望索引为"c"。这就是indexOfCharAfterPattern所包含的内容。到那时,您已经将角色隔离了。在我的示例中,我将其临时存储为charAfterPattern并打印出来。

我添加了if (indexOfCharAfterPattern < text.length())检查以防止text中的最后一个“ ab”。最后一个“ ab”之后没有任何内容,因此试图向前看下一个字符将无效。

public static void printThatFollowPattern(String text, String pattern) {
    int i = 0;
    while (i < text.length()) {
        int indexOfNextPatternStart = text.indexOf(pattern, i);
        int indexOfCharAfterPattern = indexOfNextPatternStart + pattern.length();

        if (indexOfCharAfterPattern < text.length()) {
            char charAfterPattern = text.charAt(indexOfCharAfterPattern);
            System.out.println("charAfterPattern: " + charAfterPattern);
        } else {
            break;
        }

        i = indexOfCharAfterPattern + 1;
    }
}