Șir: Cum să înlocuiți mai multe caractere posibile cu un singur caracter? (Programare, Java, String)

ycomp a intrebat.

Aș dori să înlocuiesc toate '.' și ' ' cu un '_'

dar nu-mi place codul meu…

există o modalitate mai eficientă de a face acest lucru decât:

String new_s = s.toLowerCase().replaceAll(" ", "_").replaceAll(".","_");

?

toLowerCase() doar acolo, pentru că vreau să fie scris și cu minusculă…

Comentarii

  • ah codul meu nici măcar nu a funcționat… cred că din cauză că spune că replaceAll folosește expresii regulate și deci ‘.’ este o problemă –  > Por ycomp.
3 răspunsuri
beny23
String new_s = s.toLowerCase().replaceAll("[ .]", "_");

EDIT:

replaceAll este utilizarea expresiilor regulate și utilizarea . în interiorul unei clase de caractere [ ] recunoaște doar un . mai degrabă decât orice caracter.

Comentarii

adarshr

s.replaceAll("[\s\.]", "_")

Marcelo

Utilizați String#replace() în loc de String#replaceAll(), nu aveți nevoie de regex pentru înlocuirea unui singur caracter.

Am creat următoarea clasă pentru a testa ce este mai rapid, încercați-o:

public class NewClass {

    static String s = "some_string with spaces _and underlines";
    static int nbrTimes = 10000000;

    public static void main(String... args) {

        long start = new Date().getTime();
        for (int i = 0; i < nbrTimes; i++)
            doOne();
        System.out.println("using replaceAll() twice: " + (new Date().getTime() - start));



        long start2 = new Date().getTime();
        for (int i = 0; i < nbrTimes; i++)
            doTwo();
        System.out.println("using replaceAll() once: " + (new Date().getTime() - start2));

        long start3 = new Date().getTime();
        for (int i = 0; i < nbrTimes; i++)
            doThree();
        System.out.println("using replace() twice: " + (new Date().getTime() - start3));

    }

    static void doOne() {
        String new_s = s.toLowerCase().replaceAll(" ", "_").replaceAll(".", "_");
    }

    static void doTwo() {
        String new_s2 = s.toLowerCase().replaceAll("[ .]", "_");
    }

    static void doThree() {
        String new_s3 = s.toLowerCase().replace(" ", "_").replace(".", "_");
    }
}

Primesc următoarea ieșire:

folosind replaceAll() de două ori: 100274

folosind replaceAll() o dată: 24814

folosind replace() de două ori: 31642

Bineînțeles că nu am făcut profilul aplicației pentru consumul de memorie, care ar fi putut da rezultate foarte diferite.

Comentarii

  • Ar fi mai eficient să se utilizeze replace(‘ ‘, ‘ ‘‘).replace(‘.’.’,”‘) sau un cod regex cum a postat beny23? –  > Por ycomp.
  • Probabil că este mai eficient să folosiți replace() din cauza obiectelor create și a compilării modelului. Dar, pentru aplicații mici Strings nu contează chiar atât de mult… doar dacă intenționați să îl utilizați într-o buclă sau ceva de genul acesta. –  > Por Marcelo.
  • Am făcut un test aproximativ de performanță folosind ambele metode de 10000 de ori, sincronizând rezultatele au fost aproape identice (regex a fost de fapt o fracțiune mai rapid). Cred că va depinde de dimensiunea șirului, dar dacă vă îngrijorează diferența de performanță, singura modalitate este să o testați… –  > Por beny23.
  • Am decis să aleg regex pentru că există o posibilitate îndepărtată (25% șanse) ca în viitor să am nevoie să adaug un al 3-lea caracter sau ceva de genul… regex lasă deschisă o mai mare flexibilitate. mulțumesc pentru testele de performanță. –  > Por ycomp.

Tags:,