Bagaimana saya bisa memeriksa apakah satu karakter muncul dalam sebuah string?

210

Di Jawa apakah ada cara untuk memeriksa kondisinya:

"Apakah karakter tunggal ini muncul sama sekali dalam string x"

tanpa menggunakan loop?

barfoon
sumber
4
Apakah ada alasan khusus mengapa Anda mencoba menghindari loop?
shsteimer
2
Anda tidak dapat melakukan pencarian umum untuk karakter tanpa loop. Cari cara kerja Mesin Turing.
Salvador Valencia
4
Kita harus menganggap @barfoon tidak ingin loop berada dalam kode mereka. Jelas mesin melakukan perulangan di suatu tempat. Kalau tidak, pertanyaannya adalah omong kosong.
WW.
Saya akan mengatakan manipulasi string java cukup terbatas
ACV

Jawaban:

276

Anda bisa menggunakannya string.indexOf('a').

Jika char ahadir di string:

itu mengembalikan indeks kemunculan karakter pertama dalam urutan karakter yang diwakili oleh objek ini, atau -1 jika karakter tidak muncul.

mP.
sumber
8
Tetapi selalu ada loop di belakang panggilan itu karena Anda tidak dapat menemukan simbol sebaliknya.
vava
4
indexOf () menggunakan loop secara internal.
mmcdole
22
Bukan itu yang diminta Barfoon. B ingin menghindari pengulangan dalam kode B. Tentu saja API perlu melakukan loop setelah semua String adalah array karakter yang dibungkus dalam kelas yang bagus dengan banyak metode yang berguna.
mP.
5
Bagaimana jawaban ini mendapatkan begitu banyak upvotes? Solusi penggunaan indexOf()menggunakan loop secara internal. Tidak ada jawaban yang memberikan solusi yang benar dan jika seseorang berani mengajukan pertanyaan baru, orang-orang menyatakannya Duplicate. Sangat mengecewakan; (
Prashant Prabhakar Singh
4
@ PrashantPrabhakarSingh Saya tidak melihat bagaimana ini bisa dilakukan tanpa loop. String kurang lebih adalah sekelompok karakter. Jika itu adalah grup (koleksi, array, dll) maka tidak masalah apakah itu internal atau eksternal ke kode asli, saya akan berharap bahwa Anda akan memerlukan loop untuk menemukan sesuatu dalam "grup". Saya percaya "tanpa menggunakan lingkaran?" lebih seperti "tanpa menulis loop saya sendiri?".
Tyler
145
  • String.contains() yang memeriksa apakah string berisi urutan nilai char yang ditentukan
  • String.indexOf() yang mengembalikan indeks dalam string kemunculan pertama karakter atau substring yang ditentukan (ada 4 variasi metode ini)
Zach Scrivena
sumber
15
sebuah char bukan sebuah CharSequence sehingga tidak dapat diteruskan ke String.contains (CharSequence).
mP.
28
Untuk menggunakan String.contains () dengan satu karakter c lakukan ini: String.contains (Character.toString (c))
friederbluemle
7
Atau lakukan ini jika Anda suka kode pendek:String.contains(""+c)
Felix Neumeyer
31

Saya tidak yakin apa yang ditanyakan oleh pengirim aslinya. Karena indexOf (...) dan berisi (...) keduanya mungkin menggunakan loop secara internal, mungkin dia mencari untuk melihat apakah ini mungkin sama sekali tanpa loop? Saya bisa memikirkan dua cara, satu tentu saja akan menjadi pengulangan:

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

Yang lain jauh kurang elegan, tetapi kelengkapan ...:

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

Jumlah garis bertambah karena Anda perlu mendukung string yang lebih lama dan lebih lama tentu saja. Tetapi tidak ada loop / rekursi sama sekali. Anda bahkan dapat menghapus pemeriksaan panjang jika Anda khawatir panjang itu () menggunakan loop.

Jack Leow
sumber
10
Jika Anda mendefinisikan rekursi sebagai prosedur non-loop, Anda seorang geek: D +1 karena menjadi kreatif.
guerda
1
Semuanya baik untuk panjang kode yang sulit dari 5. Jika tidak, HARUS MELAKUKAN LOOP untuk mencari karakter. Bukan untuk menjadi sombong tapi, buktinya ditunjukkan oleh definisi Mesin Turing. Fondasi perangkat komputasi.
Salvador Valencia
4
Koreksi saya jika saya salah, saya merasa pada akhirnya, rekursi adalah lingkaran yang menyamar bukan? Dan itu dapat menyebabkan konsumsi memori lebih dari loop biasa dalam beberapa skenario.
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");
}
Richard
sumber
1
bukankah ini duplikat jawaban yang diterima ?, kami mengakui upaya Anda tetapi Anda harus mencoba menemukan beberapa pertanyaan yang belum terjawab dan menjawabnya.
Shekhar_Pro
7

Anda dapat menggunakan 2 metode dari Stringkelas.

  • String.contains() yang memeriksa apakah string berisi urutan nilai char yang ditentukan
  • String.indexOf() yang mengembalikan indeks dalam string kemunculan pertama karakter yang ditentukan atau substring atau mengembalikan -1 jika karakter tidak ditemukan (ada 4 variasi metode ini)

Metode 1:

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

Metode 2:

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

Tautan oleh: Zach Scrivena

Halfacht
sumber
4

Untuk memeriksa apakah ada sesuatu yang tidak ada dalam sebuah string, Anda setidaknya perlu melihat setiap karakter dalam sebuah string. Jadi, bahkan jika Anda tidak secara eksplisit menggunakan loop, itu akan memiliki efisiensi yang sama. Yang sedang berkata, Anda dapat mencoba menggunakan str.contains ("" + char).

mweiss
sumber
Sepakat. Pada titik tertentu, seseorang, di suatu tempat perlu membuat loop untuk melakukan ini. Untungnya Java API melakukan ini atau kode kita akan sangat berantakan!
Fortyrunner
4

Jika Anda perlu memeriksa string yang sama sering Anda dapat menghitung kemunculan karakter di muka. Ini adalah implementasi yang menggunakan bit array yang terkandung dalam array panjang:

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;
}}
fillumina
sumber
Saya mencoba solusi Anda pada masalah serupa yang saya miliki. Solusi terdekat saya adalah lebih dari 1500 milidetik untuk string1 panjang 63k dan panjang string2 95k. Solusi Anda mengeluarkan hasilnya dalam 3-5 milidetik. Bisakah Anda mengedit solusi Anda untuk memasukkan penjelasan? Silahkan?
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);
    }
}
Praveen kumar
sumber
2
dan forbukan loop sekarang?
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'");

Keluaran

string does not contains the char 's'
Praveen
sumber
Jawaban yang sama telah diberikan sebelumnya.
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());
}
Ganeshmani
sumber
Di sini kita mencari kemunculan setiap karakter dari String b yang ada di String a dan menghapus karakter.
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
Nandu cg
sumber
0

Apakah di bawah ini yang Anda cari?

int index = string.indexOf(character);
return index != -1 && string.lastIndexOf(character) != index;
Toochka
sumber
Mengapa Anda memiliki && string.lastIndexOf(character) != index
GreenAsJade
-1

Anda tidak akan dapat memeriksa apakah char muncul sama sekali dalam beberapa string tanpa setidaknya melewati string sekali menggunakan loop / rekursi (metode built-in seperti indexOf juga menggunakan loop)

Jika tidak. kali Anda mencari jika char dalam string x lebih banyak daripada panjang string daripada saya akan merekomendasikan menggunakan struktur data Set karena itu akan lebih efisien daripada hanya menggunakanindexOf

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

Menggunakan set Anda akan dapat memeriksa apakah karakter ada dalam string dalam waktu konstan O (1) tetapi Anda juga akan menggunakan memori tambahan (Kompleksitas ruang akan menjadi O (n)).

Dhyey
sumber
-3

Saya menggunakan metode string.includes () untuk ini yang mengembalikan benar atau salah jika string atau karakter ditemukan. Lihat dokumentasi di bawah ini.

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

Udugam
sumber
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah.
Adriano Martins
2
Jawaban ini untuk JavaScript, pertanyaan khusus mengatakan di Jawa
Hazem Farahat
-4

// ini hanya utama ... Anda dapat menggunakan wither buffered reader atau scanner

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... 
kapan saja
sumber