ฉันจะตรวจสอบว่าอักขระตัวเดียวปรากฏในสตริงได้อย่างไร


210

ใน Java มีวิธีตรวจสอบเงื่อนไข:

"อักขระนี้ปรากฏในสตริง x ทุกครั้งหรือไม่"

โดยไม่ใช้ลูป?


4
มีเหตุผลใดที่คุณพยายามหลีกเลี่ยงการวนซ้ำหรือไม่?
shsteimer

2
คุณไม่สามารถทำการค้นหาทั่วไปโดยไม่ต้องวนซ้ำ ค้นหาวิธีการทำงานของเครื่องจักรทัวริง
Salvador Valencia

4
เราควรถือว่า @barfoon ไม่ต้องการให้วงวนอยู่ในโค้ด เห็นได้ชัดว่าเครื่องจะวนรอบที่ใดที่หนึ่ง มิฉะนั้นคำถามจะไร้สาระ
WW

ฉันจะบอกว่าการจัดการสตริงของจาวาค่อนข้าง จำกัด
ACV

คำตอบ:


276

string.indexOf('a')คุณสามารถใช้

ถ้าถ่านaอยู่ในstring:

มันจะส่งกลับดัชนีของการเกิดขึ้นครั้งแรกของตัวละครในลำดับตัวละครที่เป็นตัวแทนจากวัตถุนี้หรือ -1 ถ้าตัวละครไม่ได้เกิดขึ้น


8
แต่จะมีลูปหลังการโทรเสมอเพราะคุณไม่สามารถหาสัญลักษณ์ได้
vava

4
indexOf () ใช้การวนซ้ำภายใน
mmcdole

22
นั่นไม่ใช่สิ่งที่ Barfoon ถาม B ต้องการหลีกเลี่ยงการวนซ้ำในรหัสของ B โดยปกติแล้ว API ต้องวนซ้ำหลังจากที่สตริงทั้งหมดเป็นอาร์เรย์ของอักขระที่รวมอยู่ในคลาสที่ดีพร้อมด้วยวิธีการที่มีประโยชน์มากมาย
mP

5
คำตอบเหล่านี้มีวิธีเพิ่มจำนวนผู้ติดตามอย่างไร โซลูชันการใช้การindexOf()ใช้วนรอบภายใน Duplicateไม่มีคำตอบที่ถูกต้องจะช่วยให้การแก้ปัญหาและถ้าคนที่จะกล้าถามคำถามใหม่คนประกาศว่า น่าผิดหวังจริงๆ (
Prashant Prabhakar Singh

4
@PrashantPrabhakarSingh ฉันไม่เห็นวิธีการนี้สามารถทำได้โดยไม่ต้องวนรอบ สตริงเป็นกลุ่มของอักขระมากหรือน้อย ถ้าเป็นกลุ่ม (คอลเลกชันอาร์เรย์ ฯลฯ ) ไม่ว่าจะเป็นภายในหรือภายนอกรหัสเนทีฟฉันคาดว่าคุณจะต้องวนซ้ำเพื่อค้นหาบางอย่างภายใน "กลุ่ม" ฉันเชื่อว่า "ไม่ต้องใช้ลูปหรือ" เป็นเหมือน "โดยไม่ต้องเขียนวนของตัวเองหรือไม่"
ไทเลอร์

145
  • String.contains() ซึ่งจะตรวจสอบว่าสตริงมีลำดับถ่านที่ระบุหรือไม่
  • String.indexOf() ซึ่งส่งกลับดัชนีภายในสตริงของการเกิดขึ้นครั้งแรกของอักขระที่ระบุหรือสตริงย่อย (มี 4 รูปแบบของวิธีนี้)

15
ถ่านไม่ใช่ CharSequence ดังนั้นจึงไม่สามารถส่งผ่านไปยัง String.contain (CharSequence)
mP

28
หากต้องการใช้ String.contain () ด้วยอักขระตัวเดียวให้ทำดังนี้String.contain (Character.toString (c))
Friederbluemle

7
หรือทำสิ่งนี้ถ้าคุณชอบรหัสสั้น ๆ :String.contains(""+c)
Felix Neumeyer

31

ฉันไม่แน่ใจว่าสิ่งที่โปสเตอร์ต้นฉบับถามอย่างถูกต้อง เนื่องจาก indexOf (... ) และมี (... ) ทั้งคู่อาจใช้การวนซ้ำภายในบางทีเขาอาจต้องการดูว่าสิ่งนี้เป็นไปได้หรือไม่โดยไม่ต้องวนซ้ำ? ฉันสามารถคิดถึงสองวิธีในมือแน่นอนจะเกิดขึ้นอีกครั้ง:

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

อีกอันหนึ่งดูสง่าน้อยกว่า แต่ก็ครบถ้วน ... :

/**
 * 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;
}

จำนวนบรรทัดเพิ่มขึ้นตามที่คุณต้องการเพื่อรองรับสตริงที่ยาวขึ้นและยาวขึ้น แต่ไม่มีลูป / การเกิดซ้ำเลย คุณสามารถลบการตรวจสอบความยาวได้หากคุณกังวลว่าความยาวนั้น () ใช้การวนซ้ำ


10
หากคุณกำหนดให้การเรียกซ้ำเป็นกระบวนการที่ไม่วนซ้ำคุณก็เป็นคนคล่องแคล่ว: D +1 สำหรับการสร้างสรรค์
guerda

1
ทุกอย่างดีสำหรับความยาวรหัสที่แข็ง 5 ไม่เช่นนั้นจะต้องทำลูปเพื่อค้นหาตัวละคร เพื่อไม่ให้เป็นคนอวดรู้ แต่หลักฐานนี้แสดงให้เห็นโดยคำจำกัดความของเครื่องทัวริง รากฐานของอุปกรณ์คำนวณ
Salvador Valencia Valencia

4
ถูกต้องฉันถ้าฉันผิดฉันรู้สึกว่าในตอนท้ายของวันการเรียกซ้ำเป็นห่วงในการปลอมตัวไม่ได้หรือไม่ และอาจนำไปสู่การใช้หน่วยความจำมากกว่าวนซ้ำปกติในบางสถานการณ์
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
นี่ไม่ใช่คำซ้ำที่ถูกต้องของคำตอบที่ยอมรับใช่หรือไม่เรายอมรับความพยายามของคุณ แต่คุณควรลองค้นหาคำถามที่ยังไม่ได้ตอบและตอบคำถามเหล่านั้น
Shekhar_Pro

7

คุณสามารถใช้ 2 วิธีจากStringชั้นเรียน

  • String.contains() ซึ่งจะตรวจสอบว่าสตริงมีลำดับถ่านที่ระบุหรือไม่
  • String.indexOf() ซึ่งส่งกลับดัชนีภายในสตริงของการเกิดขึ้นครั้งแรกของอักขระที่ระบุหรือสตริงย่อยหรือส่งกลับ -1 หากไม่พบอักขระ (มี 4 รูปแบบของวิธีการนี้)

วิธีที่ 1:

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

วิธีที่ 2:

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

ลิงค์โดย: Zach Scrivena


4

ในการตรวจสอบว่ามีบางสิ่งที่ไม่มีอยู่ในสตริงคุณต้องดูอักขระอย่างน้อยหนึ่งตัวในสตริง ดังนั้นแม้ว่าคุณจะไม่ได้ใช้ลูปอย่างชัดเจน แต่ก็จะมีประสิทธิภาพเหมือนกัน ที่ถูกกล่าวว่าคุณสามารถลองใช้ str.contain ("" + char)


ตกลง เมื่อถึงจุดหนึ่งบางคนต้องการสร้างวงเพื่อทำสิ่งนี้ โชคดีที่ Java API ทำเช่นนี้หรือรหัสของเราจะรกมาก!
Fortyrunner

4

หากคุณจำเป็นต้องตรวจสอบสตริงเดียวกันบ่อยครั้งคุณสามารถคำนวณอักขระที่เกิดขึ้นได้ล่วงหน้า นี่คือการใช้งานที่ใช้บิตอาร์เรย์ที่มีอยู่ในอาร์เรย์ยาว:

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

ฉันลองวิธีแก้ปัญหาของคุณในปัญหาที่คล้ายกันฉันมี โซลูชันที่ใกล้เคียงที่สุดของฉันคือมากกว่า 1,500 miliseconds สำหรับ string1 length 63k และ string2 length 95k โซลูชันของคุณจะแยกผลลัพธ์ออกเป็น 3-5 มิลลิวินาที คุณกรุณาแก้ไขทางแก้ไขเพื่อรวมคำอธิบายได้ไหม? กรุณา?
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
และforตอนนี้ไม่วนซ้ำหรอ
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'");

เอาท์พุต

string does not contains the char 's'

คำตอบเดียวกันนั้นมีให้ก่อน
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());
}

ที่นี่เรากำลังมองหาการเกิดขึ้นของตัวละครทุกตัวจาก String b ที่มีอยู่ใน String a และการลบตัวละคร
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

ด้านล่างเป็นสิ่งที่คุณกำลังมองหา?

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

ทำไมคุณถึงมี && string.lastIndexOf(character) != index
GreenAsJade

-1

คุณจะไม่สามารถตรวจสอบว่าถ่านปรากฏขึ้นในบางสายโดยไม่ต้องผ่านสายอักขระอย่างน้อยหนึ่งครั้งโดยใช้การวนซ้ำ / การเรียกซ้ำ (วิธีการในตัวเช่น indexOf ใช้การวนซ้ำ)

ถ้าไม่มี จำนวนครั้งที่คุณค้นหาว่า char อยู่ใน string xเป็นวิธีมากกว่าความยาวของสตริงมากกว่าที่ฉันอยากจะแนะนำให้ใช้โครงสร้างข้อมูลSetเนื่องจากจะมีประสิทธิภาพมากกว่าการใช้indexOf

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

ใช้ชุดคุณจะสามารถตรวจสอบว่าตัวละครที่มีอยู่ในสตริงในเวลาคงที่ O (1) แต่คุณจะใช้หน่วยความจำเพิ่มเติม (ความซับซ้อนของพื้นที่จะเป็น O (n))


-3

ฉันใช้ string.includes () วิธีการนี้ซึ่งผลตอบแทนจริงหรือเท็จหากพบสตริงหรือตัวอักษร ดูเอกสารด้านล่าง

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


ในขณะที่ลิงค์นี้อาจตอบคำถามได้ดีกว่าที่จะรวมส่วนที่สำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง คำตอบสำหรับลิงก์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงมีการเปลี่ยนแปลง
Adriano Martins

2
คำตอบนี้มีไว้สำหรับ JavaScript โดยเฉพาะคำถามที่พูดใน Java
Hazem Farahat

-4

// นี่เป็นเพียงหลัก ... คุณสามารถใช้เครื่องอ่านหรือสแกนเนอร์แบบบัฟเฟอร์

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... 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.