Bagaimana cara menghitung jumlah kemunculan char di String?


547

Saya punya talinya

a.b.c.d

Saya ingin menghitung kemunculan '.' dengan cara yang idiomatis, lebih disukai satu kalimat.

(Sebelumnya saya telah menyatakan batasan ini sebagai "tanpa loop", jika Anda bertanya-tanya mengapa semua orang mencoba menjawab tanpa menggunakan loop).


1
Pekerjaan rumah? Karena kalau tidak, saya tidak melihat persyaratan untuk menghindari loop.
PhiLho

22
Tidak membenci loop sebanyak mencari one-liner idiomatik.
Bart

2
Loop dibuat untuk masalah seperti ini, tulis loop di kelas Utility umum kemudian panggil satu liner yang baru dicetak.
che javara

Pertanyaan serupa untuk string: stackoverflow.com/questions/767759/…
koppor

Hanya untuk menunjukkan - Saya menghargai menemukan one-liner, itu menyenangkan dan (sebagai keuntungan sejati) sering mudah diingat, tapi saya ingin menunjukkan bahwa metode dan loop terpisah lebih baik dalam hampir setiap cara --Kemampuan baca dan bahkan kinerja. Sebagian besar solusi "Elegan" di bawah ini tidak akan berkinerja sangat baik karena melibatkan reformasi string / menyalin memori, sedangkan loop yang baru saja memindai string dan menghitung kejadian akan menjadi cepat dan sederhana. Bukan berarti kinerja seharusnya menjadi faktor, tetapi jangan melihat satu baris di atas satu lingkaran dan menganggap itu akan berkinerja lebih baik.
Bill K

Jawaban:


722

'One-liner idiomatik' saya untuk ini adalah:

int count = StringUtils.countMatches("a.b.c.d", ".");

Mengapa menulis sendiri ketika sudah di commons lang ?

Oneliner Spring Framework untuk ini adalah:

int occurance = StringUtils.countOccurrencesOf("a.b.c.d", ".");

44
Setara dengan jambu biji : int count = CharMatcher.is('.').countIn("a.b.c.d");... Seperti dijawab oleh dogbane dalam pertanyaan rangkap.
Jonik

25
Meskipun saya tidak akan membatalkan ini, itu (a) membutuhkan lib pihak ke-3 dan (b) mahal.
javadba

Ini hanya bekerja dengan kerja pegas yang harus diimpor.
Isuru Madusanka


19
Apa yang mahal, di setiap perusahaan tempat saya bekerja, adalah memiliki banyak kelas "* Utils" yang ditulis dengan buruk dan tidak dikelola dengan baik. Bagian dari pekerjaan Anda adalah mengetahui apa yang tersedia di Apache Commons.
AbuNassar

1016

Bagaimana dengan ini. Itu tidak menggunakan regexp di bawahnya jadi harus lebih cepat daripada beberapa solusi lain dan tidak akan menggunakan loop.

int count = line.length() - line.replace(".", "").length();

122
Cara termudah. Yang pintar. Dan itu bekerja di Android, di mana tidak ada kelas StringUtils
Jose_GD

43
Ini jawaban terbaik. Alasannya adalah yang terbaik adalah karena Anda tidak perlu mengimpor perpustakaan lain.
Alex Spencer

27
Sangat praktis tapi jelek sekali. Saya tidak merekomendasikan ini karena mengarah ke kode yang membingungkan.
Daniel San

32
Kode jelek dapat diminimalkan dengan menjadikannya metode di kelas "StringUtils" Anda sendiri. Kemudian kode jelek ada di satu tempat, dan di tempat lain bisa dibaca dengan baik.
RonR

30
Metode loop jauh lebih cepat dari ini. Terutama ketika ingin menghitung char bukan String (karena tidak ada metode String.replace (char, char)). Pada string karakter 15, saya mendapatkan perbedaan 6049 ns vs 26.739 ns (rata-rata lebih dari 100runs). Angka mentah adalah perbedaan yang sangat besar, tetapi bijak menurut persepsi ... itu bertambah. Hindari alokasi memori - gunakan loop!
Ben

282

Ringkas jawaban lain dan apa yang saya tahu semua cara untuk melakukan ini menggunakan satu-baris:

   String testString = "a.b.c.d";

1) Menggunakan Apache Commons

int apache = StringUtils.countMatches(testString, ".");
System.out.println("apache = " + apache);

2) Menggunakan Spring Framework's

int spring = org.springframework.util.StringUtils.countOccurrencesOf(testString, ".");
System.out.println("spring = " + spring);

3) Menggunakan ganti

int replace = testString.length() - testString.replace(".", "").length();
System.out.println("replace = " + replace);

4) Menggunakan replaceAll (case 1)

int replaceAll = testString.replaceAll("[^.]", "").length();
System.out.println("replaceAll = " + replaceAll);

5) Menggunakan replaceAll (case 2)

int replaceAllCase2 = testString.length() - testString.replaceAll("\\.", "").length();
System.out.println("replaceAll (second case) = " + replaceAllCase2);

6) Menggunakan split

int split = testString.split("\\.",-1).length-1;
System.out.println("split = " + split);

7) Menggunakan Java8 (kasus 1)

long java8 = testString.chars().filter(ch -> ch =='.').count();
System.out.println("java8 = " + java8);

8) Menggunakan Java8 (case 2), mungkin lebih baik untuk unicode daripada case 1

long java8Case2 = testString.codePoints().filter(ch -> ch =='.').count();
System.out.println("java8 (second case) = " + java8Case2);

9) Menggunakan StringTokenizer

int stringTokenizer = new StringTokenizer(" " +testString + " ", ".").countTokens()-1;
System.out.println("stringTokenizer = " + stringTokenizer);

Dari komentar : Hati-hati untuk StringTokenizer, karena abcd itu akan berfungsi tetapi untuk ... bc ... d atau ... abcd atau ... b ...... c ..... d ... atau dll. itu tidak akan berfungsi. Itu hanya akan dihitung. antar karakter sekali saja

Info lebih lanjut di github

Tes kinerja (menggunakan JMH , mode = AverageTime, skor 0.010lebih baik dari itu 0.351):

Benchmark              Mode  Cnt  Score    Error  Units
1. countMatches        avgt    5  0.010 ±  0.001  us/op
2. countOccurrencesOf  avgt    5  0.010 ±  0.001  us/op
3. stringTokenizer     avgt    5  0.028 ±  0.002  us/op
4. java8_1             avgt    5  0.077 ±  0.005  us/op
5. java8_2             avgt    5  0.078 ±  0.003  us/op
6. split               avgt    5  0.137 ±  0.009  us/op
7. replaceAll_2        avgt    5  0.302 ±  0.047  us/op
8. replace             avgt    5  0.303 ±  0.034  us/op
9. replaceAll_1        avgt    5  0.351 ±  0.045  us/op

String yang dicetak tidak cocok dengan yang di atas, dan urutannya yang tercepat terlebih dahulu yang membuat pencarian paling sulit. Selain itu jawaban yang bagus!
Maarten Bodewes

case 2, digeneralisasi untuk codepoint yang membutuhkan lebih dari satu unit kode UTF-16:"1🚲2🚲3 has 2".codePoints().filter((c) -> c == "🚲".codePointAt(0)).count()
Tom Blodget

174

Cepat atau lambat, sesuatu harus berulang. Jauh lebih mudah bagi Anda untuk menulis loop (sangat sederhana) daripada menggunakan sesuatu sepertisplit yang jauh lebih kuat daripada yang Anda butuhkan.

Dengan segala cara merangkum loop dalam metode yang terpisah, misalnya

public static int countOccurrences(String haystack, char needle)
{
    int count = 0;
    for (int i=0; i < haystack.length(); i++)
    {
        if (haystack.charAt(i) == needle)
        {
             count++;
        }
    }
    return count;
}

Maka Anda tidak perlu memiliki loop di kode utama Anda - tetapi loop harus ada di suatu tempat.


5
untuk (int i = 0, l = haystack.length (); i <l; i ++) bersikap baik terhadap tumpukan Anda
Chris

12
(Aku bahkan tidak yakin di mana "stack" sedikit komentar berasal dari Ini tidak seperti. Ini jawabannya adalah salah satu rekursif saya, yang memang jahat ke stack.)
Jon Skeet

2
tidak hanya itu tetapi ini mungkin anti optimasi tanpa memperhatikan apa yang dilakukan jit. Jika Anda melakukan hal di atas pada array untuk loop misalnya, Anda mungkin memperburuk keadaan.
ShuggyCoUk

4
@sulai: Kekhawatiran Chris tidak berdasar, IMO, dalam menghadapi optimasi JIT yang sepele . Apakah ada alasan bahwa komentar menarik perhatian Anda saat ini, lebih dari tiga tahun kemudian? Hanya tertarik.
Jon Skeet

1
Mungkin @sulai baru saja menemukan pertanyaan seperti yang saya lakukan (sambil bertanya-tanya apakah Java memiliki metode bawaan untuk ini) dan tidak melihat tanggalnya. Namun, saya ingin tahu bagaimana memindahkan length()panggilan di luar loop dapat membuat kinerja lebih buruk , seperti yang disebutkan oleh @ShuggyCoUk beberapa komentar.
JKillian

63

Saya punya ide yang mirip dengan Mladen, tetapi sebaliknya ...

String s = "a.b.c.d";
int charCount = s.replaceAll("[^.]", "").length();
println(charCount);

Benar. ReplaceAll (".") Akan menggantikan karakter apa pun, bukan hanya titik. ReplaceAll ("\\.") Akan bekerja. Solusi Anda lebih mudah.
VonC

jjnguy sebenarnya menyarankan replaceAll ("[^.]") terlebih dahulu, setelah melihat "abcd" .split ("\\."). length-1 solusi saya. Tapi setelah dipukul 5 kali, saya menghapus jawaban saya (dan komentarnya).
VonC

"... sekarang kamu punya dua masalah" (wajib.) Ngomong-ngomong, aku berani bertaruh bahwa ada puluhan loop mengeksekusi replaceAll()dan length(). Nah, jika itu tidak terlihat, itu tidak ada; o)
Piskvor meninggalkan gedung

2
Saya tidak berpikir itu ide yang baik untuk menggunakan regex dan membuat string baru untuk penghitungan. saya hanya akan membuat metode statis yang mengulang setiap karakter dalam string untuk menghitung angka.
mingfai

1
@mingfai: memang, tetapi pertanyaan aslinya adalah tentang membuat satu-liner, dan bahkan, tanpa loop (Anda dapat melakukan loop dalam satu baris, tetapi itu akan jelek!). Mempertanyakan pertanyaan, bukan jawabannya ... :-)
PhiLho

37
String s = "a.b.c.d";
int charCount = s.length() - s.replaceAll("\\.", "").length();

ReplaceAll (".") Akan menggantikan semua karakter.

Solusi PhiLho menggunakan ReplaceAll ("[^.]", ""), Yang tidak perlu diloloskan, karena [.] Mewakili karakter 'titik', bukan 'karakter apa pun'.


Saya suka yang ini. Masih ada satu lingkaran di sana, tentu saja, karena harus ada.
The Archetypal Paul

NB bahwa Anda perlu membagi nomor ini jika Anda ingin mencari substring dengan panjang> 1
rogerdpack

30

Solusi 'satu baris idiomatik' saya:

int count = "a.b.c.d".length() - "a.b.c.d".replace(".", "").length();

Tidak tahu mengapa solusi yang menggunakan StringUtils diterima.


4
Ada solusi yang lebih lama mirip dengan yang di posting ini.
JCalcines

7
Karena solusi ini sangat tidak efisien
András

Ini menciptakan string tambahan hanya untuk menghasilkan hitungan. Tidak tahu mengapa orang lebih suka ini daripada StringUtils jika StringUtils adalah pilihan. Jika ini bukan opsi, mereka hanya harus membuat loop sederhana di kelas utilitas.
naksir

28
String s = "a.b.c.d";
long result = s.chars().filter(ch -> ch == '.').count();

1
Pilih + untuk solusi asli.
Scadge

24

Contoh yang lebih pendek adalah

String text = "a.b.c.d";
int count = text.split("\\.",-1).length-1;

3
Yang ini tampaknya memiliki overhead yang relatif besar, diperingatkan bahwa itu dapat membuat banyak string kecil. Biasanya itu tidak masalah, tetapi gunakan dengan hati-hati.
Maarten Bodewes

19

di sini adalah solusi tanpa loop:

public static int countOccurrences(String haystack, char needle, int i){
    return ((i=haystack.indexOf(needle, i)) == -1)?0:1+countOccurrences(haystack, needle, i+1);}


System.out.println("num of dots is "+countOccurrences("a.b.c.d",'.',0));

baik, ada loop, tetapi tidak terlihat :-)

- Yonatan


2
Kecuali jika string Anda terlalu lama Anda mendapatkan OutOfMemoryError.
Spencer Kormos

Masalahnya terdengar cukup rumit untuk dijadikan pekerjaan rumah, dan jika demikian, rekursi ini mungkin adalah jawaban yang diminta untuk Anda temukan.
erickson

Itu menggunakan indexOf, yang akan berulang ... tapi ide yang bagus. Posting solusi yang benar-benar "hanya rekursif" dalam satu menit ...
Jon Skeet

Jika memiliki lebih banyak kejadian di mana slot stack Anda tersedia, Anda akan memiliki pengecualian stack overflow;)
Luca C.

15

Saya tidak suka gagasan mengalokasikan string baru untuk tujuan ini. Dan karena string sudah memiliki array char di belakang di mana ia menyimpan nilainya, String.charAt () praktis gratis.

for(int i=0;i<s.length();num+=(s.charAt(i++)==delim?1:0))

melakukan trik, tanpa alokasi tambahan yang perlu pengumpulan, dalam 1 baris atau kurang, dengan hanya J2SE.


Memberikan beberapa cinta untuk yang satu ini karena itu adalah satu-satunya yang melakukan satu melewati string. Saya peduli dengan kinerja.
javadba

1
charAtiterasi melalui 16 bit kode poin bukan karakter! A chardi Java bukan karakter. Jadi jawaban ini menyiratkan bahwa tidak boleh ada simbol Unicode dengan pengganti yang tinggi sama dengan titik kode delim. Saya tidak yakin apakah itu benar untuk titik, tetapi secara umum mungkin tidak benar.
mulai

14

Oke, terinspirasi oleh solusi Yonatan, inilah yang murni rekursif - satu-satunya metode perpustakaan yang digunakan adalah , length()dan charAt()tidak ada yang melakukan perulangan:

public static int countOccurrences(String haystack, char needle)
{
    return countOccurrences(haystack, needle, 0);
}

private static int countOccurrences(String haystack, char needle, int index)
{
    if (index >= haystack.length())
    {
        return 0;
    }

    int contribution = haystack.charAt(index) == needle ? 1 : 0;
    return contribution + countOccurrences(haystack, needle, index+1);
}

Apakah rekursi dianggap sebagai pengulangan tergantung pada definisi pasti yang Anda gunakan, tetapi mungkin sedekat yang Anda dapatkan.

Saya tidak tahu apakah sebagian besar JVM melakukan rekursi ekor akhir-akhir ini ... jika tidak, Anda akan mendapatkan stack overflow eponymous untuk string yang panjang, tentu saja.


Tidak, rekursi ekor mungkin ada di Jawa 7, tetapi belum tersebar luas. Rekursi ekor langsung yang sederhana ini dapat diterjemahkan ke loop pada waktu kompilasi, tetapi Java 7 sebenarnya dibangun untuk JVM untuk menangani rantai melalui metode yang berbeda.
erickson

3
Anda akan cenderung mendapatkan rekursi ekor jika metode Anda mengembalikan panggilan ke dirinya sendiri (termasuk parameter total berjalan), daripada mengembalikan hasil melakukan penambahan.
Stephen Denne

12

Terinspirasi oleh Jon Skeet, versi non-loop yang tidak akan meniup stack Anda. Juga titik awal yang berguna jika Anda ingin menggunakan kerangka kerja fork-join.

public static int countOccurrences(CharSequeunce haystack, char needle) {
    return countOccurrences(haystack, needle, 0, haystack.length);
}

// Alternatively String.substring/subsequence use to be relatively efficient
//   on most Java library implementations, but isn't any more [2013].
private static int countOccurrences(
    CharSequence haystack, char needle, int start, int end
) {
    if (start == end) {
        return 0;
    } else if (start+1 == end) {
        return haystack.charAt(start) == needle ? 1 : 0;
    } else {
        int mid = (end+start)>>>1; // Watch for integer overflow...
        return
            countOccurrences(haystack, needle, start, mid) +
            countOccurrences(haystack, needle, mid, end);
    }
}

(Penafian: Tidak diuji, tidak dikompilasi, tidak masuk akal.)

Mungkin cara terbaik (single-threaded, no surrogate-pair support) cara untuk menulisnya:

public static int countOccurrences(String haystack, char needle) {
    int count = 0;
    for (char c : haystack.toCharArray()) {
        if (c == needle) {
           ++count;
        }
    }
    return count;
}

11

Tidak yakin tentang efisiensi ini, tetapi ini adalah kode terpendek yang dapat saya tulis tanpa membawa lib pihak ke-3:

public static int numberOf(String target, String content)
{
    return (content.split(target).length - 1);
}

4
Juga menghitung kejadian pada akhir string Anda akan harus menelepon perpecahan dengan argumen batas negatif seperti ini: return (content.split(target, -1).length - 1);. Secara default, kejadian di akhir string dihilangkan dalam Array yang dihasilkan dari split (). Lihat Doku
vlz

10

Dengan Anda juga bisa menggunakan stream untuk mencapai ini. Jelas ada iterasi di balik layar, tetapi Anda tidak harus menulisnya secara eksplisit!

public static long countOccurences(String s, char c){
    return s.chars().filter(ch -> ch == c).count();
}

countOccurences("a.b.c.d", '.'); //3
countOccurences("hello world", 'l'); //3

Menggunakan .codePoints()alih-alih .chars()akan mendukung nilai Unicode apa pun (termasuk yang membutuhkan pasangan pengganti)
Luke Usherwood

10

Juga dimungkinkan untuk menggunakan pengurangan di Java 8 untuk mengatasi masalah ini:

int res = "abdsd3$asda$asasdd$sadas".chars().reduce(0, (a, c) -> a + (c == '$' ? 1 : 0));
System.out.println(res);

Keluaran:

3

8

Sampel lengkap:

public class CharacterCounter
{

  public static int countOccurrences(String find, String string)
  {
    int count = 0;
    int indexOf = 0;

    while (indexOf > -1)
    {
      indexOf = string.indexOf(find, indexOf + 1);
      if (indexOf > -1)
        count++;
    }

    return count;
  }
}

Panggilan:

int occurrences = CharacterCounter.countOccurrences("l", "Hello World.");
System.out.println(occurrences); // 3

kode yang salah tidak berfungsi ketika saya mencoba int kejadian = CharacterCounter.countOccurrences ("1", "101"); System.out.println (kemunculan); // 1
jayesh

Saya melakukan perbaikan untuk kode yang bekerja dengan logika yang sama
MaanooAk

8

Cara paling sederhana untuk mendapatkan jawabannya adalah sebagai berikut:

public static void main(String[] args) {
    String string = "a.b.c.d";
    String []splitArray = string.split("\\.",-1);
    System.out.println("No of . chars is : " + (splitArray.length-1));
}

2
Cuplikan ini tidak mengembalikan jumlah titik yang benar untuk input "abc" yang diberikan
dekaru

@dekaru Bisakah Anda menyisipkan sengatan Anda di komentar sehingga kami dapat melihatnya.
Amar Magar

5

Jika Anda menggunakan kerangka kerja Spring, Anda mungkin juga menggunakan kelas "StringUtils". Metode ini akan menjadi "countOccurrencesOf".


5

Anda dapat menggunakan split()fungsi ini hanya dalam satu kode baris

int noOccurence=string.split("#",-1).length-1;

Split benar-benar menciptakan array string, yang menghabiskan banyak waktu.
Palec

Anda benar, itu benar - benar perhatian. Dengan cara lain ia menghindari membawa lib pihak ketiga dalam proyek Anda (jika belum dilakukan). Tergantung pada apa yang ingin Anda lakukan dan apa harapan kinerja.
Benj

3
Solusi ini TIDAK akan menyertakan klik kosong tambahan, karena argumen limitdisetel ke nol dalam pemanggilan metode pemisahan yang kelebihan beban ini. Contoh: "1##2#3#####".split("#")hanya akan menghasilkan array ukuran 4 ( [0:"1";1:""; 2:"2"; 3:"3"]), bukan ukuran 9 ( [0:"1"; 1:""; 2:"2"; 3:"3"; 4:""; 5:""; 6:""; 7:""; 8:""]).
klaar

4
public static int countOccurrences(String container, String content){
    int lastIndex, currIndex = 0, occurrences = 0;
    while(true) {
        lastIndex = container.indexOf(content, currIndex);
        if(lastIndex == -1) {
            break;
        }
        currIndex = lastIndex + content.length();
        occurrences++;
    }
    return occurrences;
}

4
import java.util.Scanner;

class apples {

    public static void main(String args[]) {    
        Scanner bucky = new Scanner(System.in);
        String hello = bucky.nextLine();
        int charCount = hello.length() - hello.replaceAll("e", "").length();
        System.out.println(charCount);
    }
}//      COUNTS NUMBER OF "e" CHAR´s within any string input

3

Sementara metode dapat menyembunyikannya, tidak ada cara untuk menghitung tanpa loop (atau rekursi). Anda ingin menggunakan char [] untuk alasan kinerja.

public static int count( final String s, final char c ) {
  final char[] chars = s.toCharArray();
  int count = 0;
  for(int i=0; i<chars.length; i++) {
    if (chars[i] == c) {
      count++;
    }
  }
  return count;
}

Menggunakan replaceAll (yaitu RE) tidak terdengar seperti cara terbaik untuk pergi.


Saya pikir ini adalah solusi paling elegan. Mengapa Anda menggunakan toCharArray dan tidak secara langsung?
Panayotis

Looping dengan karakter setidaknya dulu lebih lambat. Mungkin juga tergantung pada platform. Satu-satunya cara untuk benar-benar mengetahuinya adalah dengan mengukur perbedaannya.
tcurdt

3

Nah, dengan tugas yang sangat mirip saya menemukan Thread ini. Saya tidak melihat batasan bahasa pemrograman dan karena groovy berjalan pada java vm: Berikut adalah bagaimana saya dapat menyelesaikan Masalah saya menggunakan Groovy.

"a.b.c.".count(".")

selesai


3

Solusi yang jauh lebih mudah adalah dengan membagi string berdasarkan karakter yang cocok dengan Anda.

Contohnya,

int getOccurences(String characters, String string) { String[] words = string.split(characters); return words.length - 1; }

Ini akan menghasilkan 4 jika: getOccurences("o", "something about a quick brown fox");


Masalahnya di sini adalah bahwa array harus dialokasikan, yang sangat lambat.
Palec

2

Di suatu tempat dalam kode, sesuatu harus diulang. Satu-satunya cara untuk mengatasi ini adalah membuka gulungan sepenuhnya loop:

int numDots = 0;
if (s.charAt(0) == '.') {
    numDots++;
}

if (s.charAt(1) == '.') {
    numDots++;
}


if (s.charAt(2) == '.') {
    numDots++;
}

... dll, tapi kemudian kaulah yang melakukan loop, secara manual, di editor sumber - bukan komputer yang akan menjalankannya. Lihat kodesemu:

create a project
position = 0
while (not end of string) {
    write check for character at position "position" (see above)
}
write code to output variable "numDots"
compile program
hand in homework
do not think of the loop that your "if"s may have been optimized and compiled to

2

Berikut adalah solusi rekursi gaya yang sedikit berbeda:

public static int countOccurrences(String haystack, char needle)
{
    return countOccurrences(haystack, needle, 0);
}

private static int countOccurrences(String haystack, char needle, int accumulator)
{
    if (haystack.length() == 0) return accumulator;
    return countOccurrences(haystack.substring(1), needle, haystack.charAt(0) == needle ? accumulator + 1 : accumulator);
}

2

Mengapa tidak hanya membagi karakter dan kemudian mendapatkan panjang array yang dihasilkan panjang array akan selalu menjadi jumlah instance + 1. Benar?


2

Kode sumber berikut akan memberi Anda no.of kemunculan string yang diberikan dalam kata yang dimasukkan oleh pengguna: -

import java.util.Scanner;

public class CountingOccurences {

    public static void main(String[] args) {

        Scanner inp= new Scanner(System.in);
        String str;
        char ch;
        int count=0;

        System.out.println("Enter the string:");
        str=inp.nextLine();

        while(str.length()>0)
        {
            ch=str.charAt(0);
            int i=0;

            while(str.charAt(i)==ch)
            {
                count =count+i;
                i++;
            }

            str.substring(count);
            System.out.println(ch);
            System.out.println(count);
        }

    }
}

2
int count = (line.length() - line.replace("str", "").length())/"str".length();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.