Java: phương thức để có được vị trí của một trận đấu trong Chuỗi?


138
String match = "hello";
String text = "0123456789hello0123456789";

int position = getPosition(match, text); // should be 10, is there such a method?

Câu trả lời:


259

Họ của các phương thức thực hiện điều này là:

Trả về chỉ mục trong chuỗi này của lần xuất hiện đầu tiên ( hoặc cuối cùng ) của chuỗi con được chỉ định [tìm kiếm tiến ( hoặc lùi ) bắt đầu từ chỉ mục đã chỉ định].


String text = "0123hello9012hello8901hello7890";
String word = "hello";

System.out.println(text.indexOf(word)); // prints "4"
System.out.println(text.lastIndexOf(word)); // prints "22"

// find all occurrences forward
for (int i = -1; (i = text.indexOf(word, i + 1)) != -1; i++) {
    System.out.println(i);
} // prints "4", "13", "22"

// find all occurrences backward
for (int i = text.length(); (i = text.lastIndexOf(word, i - 1)) != -1; i++) {
    System.out.println(i);
} // prints "22", "13", "4"

2
lolz, vừa nhận ra một nhiệm vụ bên trong vòng lặp while, sau đó bạn đăng một nhiệm vụ bên trong vòng lặp for +1
hhh

4
@polygenelubricants - ví dụ "tìm tất cả các lần xuất hiện" của bạn rất thông minh. Nhưng nếu xem xét mã đó, bạn sẽ có một bài giảng về khả năng duy trì mã.
Stephen C

3
Làm thế nào bạn sẽ viết nó? Tôi thành thật hỏi, bởi vì tôi chưa có kinh nghiệm đánh giá mã chuyên nghiệp trước đây.
đa sinh học

1
Trong tất cả các lần xuất hiện, thay vì i ++, chúng ta có thể viết i + = word.length (). Nó sẽ nhanh hơn một chút.
Có thể nghỉ ngơi trong hòa bình

Vòng lặp đầu tiên sẽ không tìm thấy tất cả các vị trí nếu khớp với một char. Bạn không cần +1 trong câu lệnh thứ hai của vòng lặp, bởi vì câu lệnh thứ ba không đếm i ++ hãy thử String text = "0011100"; phù hợp với từ char "1", nó sẽ in 2,4 chứ không phải 2,3,4
Strauteka

40

Điều này hoạt động bằng cách sử dụng regex.

String text = "I love you so much";
String wordToFind = "love";
Pattern word = Pattern.compile(wordToFind);
Matcher match = word.matcher(text);

while (match.find()) {
     System.out.println("Found love at index "+ match.start() +" - "+ (match.end()-1));
}

Đầu ra:

Tìm thấy "tình yêu" ở chỉ số 2 - 5

Nguyên tắc chung :

  • Regex tìm kiếm từ trái sang phải và một khi các ký tự trùng khớp đã được sử dụng, nó không thể được sử dụng lại.

19
Điều này hoạt động tuyệt vời, nhưng với câu này tôi đã nhận được kết quả là "Tôi có bạn trai" :-)
Gaurav Pangam


8

Tìm một chỉ mục

Như những người khác đã nói, sử dụng text.indexOf(match)để tìm một trận đấu duy nhất.

String text = "0123456789hello0123456789";
String match = "hello";
int position = text.indexOf(match); // position = 10

Tìm nhiều chỉ mục

Do nhận xét của @ StephenC về khả năng duy trì mã và khó khăn của tôi trong việc hiểu câu trả lời của @polygenelubricants , tôi muốn tìm một cách khác để có được tất cả các chỉ mục của một trận đấu trong chuỗi văn bản. Đoạn mã sau (được sửa đổi từ câu trả lời này ) thực hiện như vậy:

String text = "0123hello9012hello8901hello7890";
String match = "hello";

int index = text.indexOf(match);
int matchLength = match.length();
while (index >= 0) {  // indexOf returns -1 if no match found
    System.out.println(index);
    index = text.indexOf(match, index + matchLength);
}


2

Bạn có thể nhận được tất cả các kết quả khớp trong một tệp chỉ bằng cách gán bên trong while-loop, cool:

$ javac MatchTest.java 
$ java MatchTest 
1
16
31
46
$ cat MatchTest.java 
import java.util.*;
import java.io.*;

public class MatchTest {
    public static void main(String[] args){
        String match = "hello";
        String text = "hello0123456789hello0123456789hello1234567890hello3423243423232";
        int i =0;
        while((i=(text.indexOf(match,i)+1))>0)
            System.out.println(i);
    }
}

2
Cách bạn bù đắp ibằng +1công việc, nhưng theo cách vòng vo. Như bạn đã trình bày ở đây, nó báo cáo đầu tiên hellotại i == 1. Sẽ phù hợp hơn nhiều nếu bạn luôn sử dụng lập chỉ mục dựa trên 0.
đa sinh học

1
... sẽ đánh cắp thứ của bạn: P Cảm ơn bạn.
hhh

2
int match_position=text.indexOf(match);

1
Vui lòng giải thích những gì bạn đã làm
Fabio

1
@Fabio getP vị trí (khớp, văn bản) {int match_poseition = text.indexOf (khớp); trở match_position;}
Sayed

1
import java.util.StringTokenizer;

public class Occourence {

  public static void main(String[] args) {
    String key=null,str ="my name noorus my name noorus";        
    int i=0,tot=0;

    StringTokenizer st=new StringTokenizer(str," ");
    while(st.hasMoreTokens())
    {   
        tot=tot+1;
        key = st.nextToken();
        while((i=(str.indexOf(key,i)+1))>0)
        {
            System.out.println("position of "+key+" "+"is "+(i-1));
        }
    }

    System.out.println("total words present in string "+tot);
  }
}

1
Bạn có thể giải thích tại sao điều này hoạt động và những gì đang diễn ra trong sự bảo vệ của vòng lặp bên trong? Một lời giải thích có thể hữu ích cho một người đọc mới làm quen.
Paul Hicks

1
int indexOf (String str, int from Index): Trả về chỉ mục trong chuỗi này về lần xuất hiện đầu tiên của chuỗi con được chỉ định, bắt đầu từ chỉ mục đã chỉ định. Nếu nó không xảy ra, -1 được trả về. Ở đây, vòng lặp bên trong của while sẽ có thể nhận được tất cả mã nguồn của mã thông báo (ở đây được chỉ định bởi biến có tên là 'khóa').
Khan

1

Tôi có một số mã lớn nhưng làm việc tốt ....

   class strDemo
   { 
       public static void main(String args[])
       {
       String s1=new String("The Ghost of The Arabean Sea");
           String s2=new String ("The");
           String s6=new String ("ehT");
           StringBuffer s3;
           StringBuffer s4=new StringBuffer(s1);
           StringBuffer s5=new StringBuffer(s2);
           char c1[]=new char[30];
           char c2[]=new char[5];
           char c3[]=new char[5];
           s1.getChars(0,28,c1,0);
           s2.getChars(0,3,c2,0);
           s6.getChars(0,3,c3,0); s3=s4.reverse();      
           int pf=0,pl=0;
           char c5[]=new char[30];
           s3.getChars(0,28,c5,0);
           for(int i=0;i<(s1.length()-s2.length());i++)
           {
               int j=0;
               if(pf<=1)
               {
                  while (c1[i+j]==c2[j] && j<=s2.length())
                  {           
                    j++;
                    System.out.println(s2.length()+" "+j);
                    if(j>=s2.length())
                    {
                       System.out.println("first match of(The) :->"+i);

                     }
                     pf=pf+1;         
                  }   
             }                
       }       
         for(int i=0;i<(s3.length()-s6.length()+1);i++)
        {
            int j=0;
            if(pl<=1)
            {
             while (c5[i+j]==c3[j] && j<=s6.length())
             {
                 j++;
                 System.out.println(s6.length()+" "+j);
                 if(j>=s6.length())
                 {
                         System.out.println((s3.length()-i-3));
                         pl=pl+1;

                 }   
                }                 
              }  
           }  
         }
       }

2
đặt một số giải thích / nhận xét trong mã của bạn sẽ giúp mọi người dễ hiểu mã của bạn hơn, đặc biệt là mã dài :)
himawan_r

1
//finding a particular word any where inthe string and printing its index and occurence  
class IndOc
{
    public static void main(String[] args) 
    {
        String s="this is hyderabad city and this is";
        System.out.println("the given string is ");
        System.out.println("----------"+s);
        char ch[]=s.toCharArray();
        System.out.println(" ----word is found at ");
        int j=0,noc=0;
        for(int i=0;i<ch.length;i++)
        {
            j=i;

            if(ch[i]=='i' && ch[j+1]=='s')
            {
                System.out.println(" index "+i);
            noc++;  
            }

        }
        System.out.println("----- no of occurences are "+noc);

    }
}

3
Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Peter Brittain

1
    String match = "hello";
    String text = "0123456789hello0123456789hello";

    int j = 0;
    String indxOfmatch = "";

    for (int i = -1; i < text.length()+1; i++) {
        j =  text.indexOf("hello", i);
        if (i>=j && j > -1) {
            indxOfmatch += text.indexOf("hello", i)+" ";
        }
    }
    System.out.println(indxOfmatch);

0

Nếu bạn định quét các kết quả tìm kiếm của chuỗi tìm kiếm, tôi khuyên bạn nên sử dụng các biểu thức thông thường . Họ có một đường cong học tập dốc, nhưng họ sẽ giúp bạn tiết kiệm hàng giờ khi tìm kiếm phức tạp.


2
Gợi ý: Bao gồm một ví dụ về nhận vị trí từ biểu thức chính quy. Chỉ "thử sử dụng biểu thức chính quy" là một nhận xét khá cơ bản và không trả lời câu hỏi của OP.
Brad Koch

0

cho nhiều lần xuất hiện và ký tự được tìm thấy trong chuỗi ?? có hoặc không

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class SubStringtest {

    public static void main(String[] args)throws Exception {
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
     System.out.println("enter the string");
    String str=br.readLine();
    System.out.println("enter the character which you want");
    CharSequence ch=br.readLine();   
    boolean bool=str.contains(ch);
    System.out.println("the character found is " +bool);
    int position=str.indexOf(ch.toString());

    while(position>=0){
        System.out.println("the index no of character is " +position); 
        position=str.indexOf(ch.toString(),position+1);
    }


    }

}

0
public int NumberWordsInText(String FullText_, String WordToFind_, int[] positions_)
   {
    int iii1=0;
    int iii2=0;
    int iii3=0;
    while((iii1=(FullText_.indexOf(WordToFind_,iii1)+1))>0){iii2=iii2+1;}
    // iii2 is the number of the occurences
    if(iii2>0) {
        positions_ = new int[iii2];
        while ((iii1 = (FullText_.indexOf(WordToFind_, iii1) + 1)) > 0) {
            positions_[iii3] = iii1-1;
            iii3 = iii3 + 1;
            System.out.println("position=" + positions_[iii3 - 1]);
        }
    }
    return iii2;
}

Hy vọng Nó sẽ giải quyết vấn đề nhưng vui lòng thêm giải thích về mã của bạn với nó để người dùng sẽ hiểu hoàn hảo những gì anh ấy / cô ấy thực sự muốn.
Jaimil Patel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.