[java] 문자열에있는 모든 문자의 색인

다음 코드는 2를 인쇄합니다.

String word = "bannanas";
String guess = "n";
int index;
System.out.println(
    index = word.indexOf(guess)
);

문자열 “bannanas”에서 “n”( “guess”)의 모든 인덱스를 얻는 방법을 알고 싶습니다.

예상되는 결과는 다음과 같습니다. [2,3,5]



답변

이것은 Peter Lawrey의 솔루션 가진 -1끝에 없는 위치 목록을 인쇄해야합니다 .

int index = word.indexOf(guess);
while (index >= 0) {
    System.out.println(index);
    index = word.indexOf(guess, index + 1);
}

for루프 로도 수행 할 수 있습니다 .

for (int index = word.indexOf(guess);
     index >= 0;
     index = word.indexOf(guess, index + 1))
{
    System.out.println(index);
}

[참고 : guess한 문자보다 길 수있는 경우 guess문자열 을 분석 word하여 위의 루프보다 더 빠르게 반복 할 수 있습니다. 이러한 접근 방식의 벤치 마크는 Boyer-Moore 알고리즘 입니다. 그러나 그러한 접근 방식을 선호하는 조건은 존재하지 않는 것 같습니다.]


답변

다음을 시도하십시오 (지금 끝에 -1이 인쇄되지 않습니다!)

int index = word.indexOf(guess);
while(index >= 0) {
   System.out.println(index);
   index = word.indexOf(guess, index+1);
}


답변

String string = "bannanas";
ArrayList<Integer> list = new ArrayList<Integer>();
char character = 'n';
for(int i = 0; i < string.length(); i++){
    if(string.charAt(i) == character){
       list.add(i);
    }
}

결과는 다음과 같이 사용됩니다.

    for(Integer i : list){
        System.out.println(i);
    }

또는 배열로 :

list.toArray();


답변

Java9를 사용하면 iterate(int seed, IntPredicate hasNext,IntUnaryOperator next)다음과 같이 사용할 수 있습니다 .

List<Integer> indexes = IntStream
          .iterate(word.indexOf(c), index -> index >= 0, index -> word.indexOf(c, index + 1))
          .boxed()
          .collect(Collectors.toList());
System.out.printlnt(indexes);


답변

int index = -1;
while((index = text.indexOf("on", index + 1)) >= 0) {
   LOG.d("index=" + index);
}


답변

정규 표현식을 사용하여 Java 9에서 기능적으로 수행 할 수 있습니다.

Pattern.compile(Pattern.quote(guess)) // sanitize input and create pattern
            .matcher(word) // create matcher
            .results()     // get the MatchResults, Java 9 method
            .map(MatchResult::start) // get the first index
            .collect(Collectors.toList()) // collect found indices into a list
    );

다음은 CharSequence확장 메소드를 사용 하여이 로직을 API에 새로운 메소드로 추가하는 Kotlin 솔루션입니다 .

 // Extension method
fun CharSequence.indicesOf(input: String): List<Int> =
    Regex(Pattern.quote(input)) // build regex
        .findAll(this)          // get the matches
        .map { it.range.first } // get the index
        .toCollection(mutableListOf()) // collect the result as list

// call the methods as
"Banana".indicesOf("a") // [1, 3, 5]


답변

String word = "bannanas";

String guess = "n";

String temp = word;

while(temp.indexOf(guess) != -1) {
     int index = temp.indexOf(guess);
     System.out.println(index);
     temp = temp.substring(index + 1);
}