Làm cách nào để kiểm tra xem một ký tự có xuất hiện trong chuỗi không?


208

Trong Java có một cách để kiểm tra điều kiện:

"Có phải ký tự đơn này xuất hiện ở tất cả trong chuỗi x"

mà không sử dụng một vòng lặp?


4
Có bất kỳ lý do cụ thể mà bạn đang cố gắng tránh các vòng lặp?
shsteimer

2
Bạn không thể thực hiện tìm kiếm chung cho nhân vật mà không có vòng lặp. Tra cứu cách thức hoạt động của một máy Turing.
Salvador Valencia

4
Chúng ta nên giả sử @barfoon không muốn vòng lặp nằm trong mã của họ. Rõ ràng máy làm một vòng lặp ở đâu đó. Nếu không thì câu hỏi là vô nghĩa.
Thế chiến.

Tôi có thể nói rằng thao tác chuỗi của java khá hạn chế
ACV

Câu trả lời:


275

Bạn có thể sử dụng string.indexOf('a').

Nếu char acó mặt trong string:

nó trả về chỉ số xuất hiện đầu tiên của ký tự trong chuỗi ký tự được đại diện bởi đối tượng này hoặc -1 nếu ký tự không xảy ra.


8
Nhưng luôn có một vòng lặp đằng sau cuộc gọi đó bởi vì bạn không thể tìm thấy một biểu tượng nào khác.
vava

4
indexOf () sử dụng một vòng lặp bên trong.
mmcdole

22
Đó không phải là những gì Barfoon yêu cầu. B muốn tránh thực hiện vòng lặp trong mã của B. Đương nhiên, API cần thực hiện một vòng lặp sau khi tất cả Chuỗi là một mảng các ký tự được gói trong một lớp đẹp với nhiều phương thức hữu ích.
mP.

5
Làm thế nào là những câu trả lời nhận được rất nhiều upvote? Các giải pháp sử indexOf()dụng vòng lặp sử dụng nội bộ. Không có câu trả lời nào đưa ra giải pháp chính xác và nếu ai đó dám hỏi một câu hỏi mới, mọi người sẽ tuyên bố nó Duplicate. Thật đáng thất vọng; (
Prashant Mitchhakar Singh

4
@PrashantPrabhakarSingh Tôi không thấy cách này có thể được thực hiện mà không có vòng lặp. Một chuỗi ít nhiều là một nhóm các ký tự. Nếu đó là một nhóm (bộ sưu tập, mảng, v.v.) thì không có vấn đề gì nếu nó là nội bộ hay bên ngoài mã gốc, tôi hy vọng rằng bạn sẽ cần một vòng lặp để tìm thứ gì đó trong "nhóm". Tôi tin rằng "không sử dụng một vòng lặp?" giống như "không cần viết vòng lặp của riêng tôi?".
Tyler

144
  • String.contains() trong đó kiểm tra xem chuỗi có chứa một chuỗi các giá trị char được chỉ định không
  • String.indexOf() trong đó trả về chỉ mục trong chuỗi xuất hiện đầu tiên của ký tự hoặc chuỗi con được chỉ định (có 4 biến thể của phương thức này)

15
một char không phải là CharSequence vì vậy nó không thể được chuyển đến String.contains (CharSequence).
mP.

28
Để sử dụng String.contains () với một char c, hãy làm điều này: String.contains (Character.toString (c))
Friederbluemle

7
Hoặc làm điều này nếu bạn thích mã ngắn:String.contains(""+c)
Felix Neumeyer

31

Tôi không chắc chắn những gì các poster ban đầu đang hỏi chính xác. Vì indexOf (...) và chứa (...) cả hai có thể sử dụng các vòng lặp bên trong, có lẽ anh ấy đang tìm kiếm để xem liệu điều này có khả thi hay không mà không có vòng lặp? Tôi có thể nghĩ ra hai cách, tất nhiên một là sẽ tái phát:

public boolean containsChar(String s, char search) {
    if (s.length() == 0)
        return false;
    else
        return s.charAt(0) == search || containsChar(s.substring(1), search);
}

Khác là ít thanh lịch, nhưng đầy đủ ...:

/**
 * Works for strings of up to 5 characters
 */
public boolean containsChar(String s, char search) {
    if (s.length() > 5) throw IllegalArgumentException();

    try {
        if (s.charAt(0) == search) return true;
        if (s.charAt(1) == search) return true;
        if (s.charAt(2) == search) return true;
        if (s.charAt(3) == search) return true;
        if (s.charAt(4) == search) return true;
    } catch (IndexOutOfBoundsException e) {
        // this should never happen...
        return false;
    }
    return false;
}

Số lượng dòng tăng lên khi bạn cần hỗ trợ chuỗi dài hơn và dài hơn tất nhiên. Nhưng không có vòng lặp / tái phát nào cả. Bạn thậm chí có thể xóa kiểm tra độ dài nếu bạn lo ngại rằng độ dài đó () sử dụng vòng lặp.


10
Nếu bạn xác định đệ quy là một quy trình không lặp, bạn là người đam mê: D +1 vì đã sáng tạo.
guerda

1
Tất cả đều tốt cho độ dài được mã hóa cứng là 5. Nếu không thì CẦN LÀM MỘT LOOP để tìm kiếm nhân vật. Không phải là mô phạm nhưng, bằng chứng về điều này được thể hiện qua định nghĩa của Máy Turing. Nền tảng của một thiết bị tính toán.
Salvador Valencia

4
Chỉnh sửa cho tôi nếu tôi sai, tôi cảm thấy vào cuối ngày, một đệ quy là một vòng lặp ngụy trang phải không? Và nó có thể dẫn đến tiêu thụ bộ nhớ nhiều hơn một vòng lặp thông thường trong một số tình huống.
PasinduJay

12
String temp = "abcdefghi";
if(temp.indexOf("b")!=-1)
{
   System.out.println("there is 'b' in temp string");
}
else
{
   System.out.println("there is no 'b' in temp string");
}

1
Đây có phải là bản sao chính xác của câu trả lời được chấp nhận không?, chúng tôi ghi nhận nỗ lực của bạn nhưng bạn nên thử tìm một số câu hỏi chưa được trả lời và trả lời chúng.
Shekhar_Pro

7

Bạn có thể sử dụng 2 phương thức từ Stringlớp.

  • String.contains() trong đó kiểm tra xem chuỗi có chứa một chuỗi các giá trị char được chỉ định không
  • String.indexOf() trong đó trả về chỉ mục trong chuỗi xuất hiện đầu tiên của ký tự hoặc chuỗi con được chỉ định hoặc trả về -1 nếu không tìm thấy ký tự (có 4 biến thể của phương thức này)

Cách 1:

String myString = "foobar";
if (myString.contains("x") {
    // Do something.
}

Cách 2:

String myString = "foobar";
if (myString.indexOf("x") >= 0 {
    // Do something.
}

Liên kết bởi: Zach Scrivena


4

Để kiểm tra xem một cái gì đó không tồn tại trong một chuỗi, ít nhất bạn cần xem xét từng ký tự trong một chuỗi. Vì vậy, ngay cả khi bạn không sử dụng một vòng lặp rõ ràng, nó sẽ có hiệu quả tương tự. Điều đó đang được nói, bạn có thể thử sử dụng str.contains ("" + char).


Đã đồng ý. Tại một số điểm, ai đó, một nơi nào đó cần phải xây dựng một vòng lặp để làm điều này. May mắn thay, API Java thực hiện điều này hoặc mã của chúng tôi sẽ rất lộn xộn!
Fortyrunner

4

Nếu bạn cần kiểm tra cùng một chuỗi thường xuyên, bạn có thể tính toán các lần xuất hiện của ký tự. Đây là một triển khai sử dụng một mảng bit chứa trong một mảng dài:

public class FastCharacterInStringChecker implements Serializable {
private static final long serialVersionUID = 1L;

private final long[] l = new long[1024]; // 65536 / 64 = 1024

public FastCharacterInStringChecker(final String string) {
    for (final char c: string.toCharArray()) {
        final int index = c >> 6;
        final int value = c - (index << 6);
        l[index] |= 1L << value;
    }
}

public boolean contains(final char c) {
    final int index = c >> 6; // c / 64
    final int value = c - (index << 6); // c - (index * 64)
    return (l[index] & (1L << value)) != 0;
}}

Tôi đã thử giải pháp của bạn về một vấn đề tương tự tôi có. Giải pháp gần nhất của tôi là hơn 1500 milis giây cho chuỗi1 dài 63k và chuỗi2 dài 95k. Giải pháp của bạn tạo ra kết quả sau 3-5 mili giây. Bạn có thể vui lòng chỉnh sửa giải pháp của bạn để bao gồm một lời giải thích? Xin vui lòng?
Viorel Florian


1
package com;
public class _index {

    public static void main(String[] args) {
        String s1="be proud to be an indian";
        char ch=s1.charAt(s1.indexOf('e'));
        int count = 0; 
        for(int i=0;i<s1.length();i++) {
            if(s1.charAt(i)=='e'){
                System.out.println("number of E:=="+ch);
                count++;
            }
        }
        System.out.println("Total count of E:=="+count);
    }
}

2
forbây giờ không phải là một vòng lặp?
Mindwin

0
String s="praveen";
boolean p=s.contains("s");
if(p)
    System.out.println("string contains the char 's'");
else
    System.out.println("string does not contains the char 's'");

Đầu ra

string does not contains the char 's'

Câu trả lời tương tự đã được cung cấp trước đây.
Serge Belov

0
static String removeOccurences(String a, String b)
{
    StringBuilder s2 = new StringBuilder(a);

    for(int i=0;i<b.length();i++){
        char ch = b.charAt(i);  
        System.out.println(ch+"  first index"+a.indexOf(ch));

        int lastind = a.lastIndexOf(ch);

    for(int k=new String(s2).indexOf(ch);k > 0;k=new String(s2).indexOf(ch)){
            if(s2.charAt(k) == ch){
                s2.deleteCharAt(k);
        System.out.println("val of s2 :             "+s2.toString());
            }
        }
      }

    System.out.println(s1.toString());

    return (s1.toString());
}

Ở đây chúng tôi đang tìm kiếm sự xuất hiện của mọi ký tự từ Chuỗi b có trong Chuỗi a và xóa các ký tự.
Ganeshmani

0
you can use this code. It will check the char is present or not. If it is present then the return value is >= 0 otherwise it's -1. Here I am printing alphabets that is not present in the input.

import java.util.Scanner;

public class Test {

public static void letters()
{
    System.out.println("Enter input char");
    Scanner sc = new Scanner(System.in);
    String input = sc.next();
    System.out.println("Output : ");
    for (char alphabet = 'A'; alphabet <= 'Z'; alphabet++) {
            if(input.toUpperCase().indexOf(alphabet) < 0) 
                System.out.print(alphabet + " ");
    }
}
public static void main(String[] args) {
    letters();
}

}

//Ouput Example
Enter input char
nandu
Output : 
B C E F G H I J K L M O P Q R S T V W X Y Z

0

Là dưới đây những gì bạn đang tìm kiếm?

int index = string.indexOf(character);
return index != -1 && string.lastIndexOf(character) != index;

Tại sao bạn có && string.lastIndexOf(character) != index
GreenAsJade

-1

Bạn sẽ không thể kiểm tra xem char có xuất hiện ở tất cả các chuỗi không mà ít nhất là đi qua chuỗi một lần bằng cách sử dụng vòng lặp / đệ quy (các phương thức tích hợp sẵn như indexOf cũng sử dụng một vòng lặp)

Nếu không. số lần bạn tìm kiếm nếu một char trong chuỗi x nhiều hơn độ dài của chuỗi so với tôi khuyên bạn nên sử dụng Cấu trúc dữ liệu Đặt vì điều đó sẽ hiệu quả hơn so với sử dụng đơn giảnindexOf

String s = "abc";

// Build a set so we can check if character exists in constant time O(1)
Set<Character> set = new HashSet<>();
int len = s.length();
for(int i = 0; i < len; i++) set.add(s.charAt(i));

// Now we can check without the need of a loop
// contains method of set doesn't use a loop unlike string's contains method
set.contains('a') // true
set.contains('z') // false

Sử dụng tập hợp, bạn sẽ có thể kiểm tra xem ký tự có tồn tại trong một chuỗi trong thời gian không đổi O (1) không nhưng bạn cũng sẽ sử dụng bộ nhớ bổ sung (Độ phức tạp không gian sẽ là O (n)).


-3

Tôi đã sử dụng phương thức string.includes () cho phương thức này trả về true hoặc false nếu tìm thấy chuỗi hoặc ký tự. Xem tài liệu dưới đây.

https://www.w3schools.com/jsref/jsref_includes.asp


Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
Adriano Martins

2
Câu trả lời này là dành cho JavaScript, câu hỏi được nói cụ thể bằng Java
Hazem Farahat

-4

// đây chỉ là chính ... bạn có thể sử dụng trình đọc hoặc trình quét bộ đệm khô héo

string s;
int l=s.length();
int f=0;
for(int i=0;i<l;i++)
   {
      char ch1=s.charAt(i); 
      for(int j=0;j<l;j++)
         {
          char ch2=charAt(j);
          if(ch1==ch2)
           {
             f=f+1;
             s.replace(ch2,'');
           }
          f=0;
          }
     }
//if replacing with null does not work then make it space by using ' ' and add a if condition on top.. checking if its space if not then only perform the inner loop... 
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.