Câu hỏi Chỉ mục của tất cả các lần xuất hiện của ký tự trong một chuỗi


Mã sau sẽ in 2

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

Tôi muốn biết làm thế nào để có được tất cả các chỉ mục của "n" ("đoán") trong chuỗi "bannanas"

Kết quả mong đợi sẽ là: [2,3,5]


76
2018-02-17 20:46


gốc




Các câu trả lời:


Điều này sẽ in danh sách các vị trí mà không cần -1 ở cuối Giải pháp của Peter Lawrey   đã có.

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

Nó cũng có thể được thực hiện như một for vòng lặp:

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

[Ghi chú: nếu guess có thể dài hơn một ký tự, sau đó có thể, bằng cách phân tích guess chuỗi, để lặp qua word nhanh hơn các vòng trên làm. Điểm chuẩn cho cách tiếp cận như vậy là Thuật toán Boyer-Moore. Tuy nhiên, các điều kiện có lợi cho việc sử dụng cách tiếp cận này dường như không có mặt.]


119
2018-02-17 21:00





Hãy thử những điều sau (Hiện tại không in -1 ở cuối!)

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

17
2018-02-17 20:48



cách sử dụng tốt nhất của indexOf! - asgs
bạn luôn in -1 ở cuối - smas
@ Cảm ơn bạn rất nhiều vì bạn đã trả lời, có vẻ như đúng, nhưng đây là thực ra ngày đầu tiên của tôi với Java vì vậy tôi là một chút bối rối bởi kết quả cuối cùng, điều này dường như đầu ra -1 vào cuối một tôi không hoàn toàn hiểu tại sao! cảm ơn!! - Trufa
@Trufa: Nó luôn luôn in -1 ở cuối bởi vì indexOf trả về -1 khi không tìm thấy ký tự. - ColinD
@Trufa - lý do nó in -1 cuối cùng là do vòng lặp thực hiện cơ thể và sau đó phát hiện ra rằng index == -1 trong việc chấm dứt while. - Ted Hopp


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);
    }
}

Kết quả sẽ được sử dụng như thế này:

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

Hoặc như một mảng:

list.toArray();

5
2018-02-17 20:47





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

2
2018-03-28 19:23





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);
}

1
2018-02-17 20:51



Ý tưởng chung là đúng, nhưng word.substring(word) sẽ không biên dịch. : P - Peter Lawrey
@ Peter, cảm ơn sự điều chỉnh. - asgs
Vẫn có một vấn đề: nó in liên tục 2. - POSIX_ME_HARDER
Gosh, tôi cần phải javac tất cả mọi thứ tôi đăng ở đây. - asgs


Với Java9, người ta có thể sử dụng iterate(int seed, IntPredicate hasNext,IntUnaryOperator next) như sau:-

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);

1
2018-02-03 03:06





    String input = "GATATATGCG";
    String substring = "G";
    String temp = input;
    String indexOF ="";
    int tempIntex=1;

    while(temp.indexOf(substring) != -1)
    {
        int index = temp.indexOf(substring);
        indexOF +=(index+tempIntex)+" ";
        tempIntex+=(index+1);
        temp = temp.substring(index + 1);
    }
    Log.e("indexOf ","" + indexOF);

0
2018-03-07 15:03



... đó là mã tìm kiếm các chuỗi DNA? ¿? ¿XD - kaytes