Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
TOPURI canale TV ; Grila ideala d...

Întaia predica a unui preot ateu

Suport prindere Navigatie

Service monitoare
 Frankfurt - noul centru financiar...

Stiri doar despre drepturile comp...

NIKON D850

Android N si aplicatiile VR cardb...
 Cazare Costinesti

Ce sa aleg dintre Xiaomi Redmi 4x...

Tepe, anunturi false, vanzatori n...

Recomandare camera bord
 Font Edwardian Script cu diacritice

Drept sau SNSPA

Caut Micro Switch Bitron M5 NC

Procesor AMD PRO A10-8750B R7
 
Forumul Softpedia folosește "cookies" pentru a oferi utilizatorilor o experiență completă. Vezi detalii sau închide mesaj (x)

Verificare ultimul caracter dintr-un String

  • Please log in to reply
23 replies to this topic

#1
cosmin35

cosmin35

    Junior

  • Grup: Members
  • Posts: 17
  • Înscris: 17.07.2007
  • ID membru: 203,415
  • Locație: bacau
Salut,

Se poate verifica daca un String se termina cu un anumit caracter? Am incercat cu endsWith dar accepta doar alt string nu un caracter.
Vreau sa verific daca un nume se termina cu 'a' sa imi afiseze mesajul ca acel nume este de "Fata" else "Baiat". :)

Multumesc

#2
tavitu

tavitu

    Active Member

  • Grup: Members
  • Posts: 1,443
  • Înscris: 16.02.2009
  • ID membru: 420,799
"a" - este un string care are doar un caracter, poate fi folosit cu endsWith().

Alte soluții ar mai fi charAt() + length() sau lastIndexOf() + length(), dar endsWith() e mai clar.

Edited by tavitu, 26 June 2017 - 09:38.


#3
danvlas

danvlas

    Active Member

  • Grup: Senior Members
  • Posts: 2,211
  • Înscris: 04.06.2009
  • ID membru: 467,361
Si daca numele este Luca?
Sau Carmen?

Edited by danvlas, 26 June 2017 - 09:40.


#4
tavitu

tavitu

    Active Member

  • Grup: Members
  • Posts: 1,443
  • Înscris: 16.02.2009
  • ID membru: 420,799
Poate sa construiască un set, cu nume de băieți care se termină în 'a' și un set cu nume de fete care nu se termină în 'a'. Verifică mai întâi dacă un nume primit e într-unul dintre set-uri, dacă e, știe deja răspunsul, dacă nu, verifcă dacă se termină în 'a' și din nou află răspunsul.

Mă gândesc că numărul de nume de băieti care se termină în 'a', respectiv, numărul de nume de fete care nu se termină în 'a' este scăzut și deci merge ceva de genul.

#5
danvlas

danvlas

    Active Member

  • Grup: Senior Members
  • Posts: 2,211
  • Înscris: 04.06.2009
  • ID membru: 467,361
Nu e fezabil. Numele unguresti, turcesti, japoneze, africane samd nu respecta regula asta, deci trebuie gasita alta solutie. Chiar vorbind numai de Romania, exista foarte multe etnii, care pot da peste cap o logica de acest fel. Unguri, rusi, evrei, greci, turci, tatari, aromani, armeni si altele, cine stie toate prenumele posibile?

#6
afh

afh

    Member

  • Grup: Members
  • Posts: 984
  • Înscris: 14.04.2005
  • ID membru: 34,666
https://www.tpu.ro/f...e-romana-stiti/

#7
tavitu

tavitu

    Active Member

  • Grup: Members
  • Posts: 1,443
  • Înscris: 16.02.2009
  • ID membru: 420,799
Dacă e să luăm așa, în lumea reală, e inutil un astfel de program, există nume unisex la care nu ai ce să le faci, iar în funcție de nevoile clientului pot fi mai mult de două sexe (M, F, secret, etc), dar pentru un începător în Java cred că ce am zis eu cu set-uri este un bun exercițiu.

#8
danvlas

danvlas

    Active Member

  • Grup: Senior Members
  • Posts: 2,211
  • Înscris: 04.06.2009
  • ID membru: 467,361
Ca exercitiu, da. Dar nu se poate folosi ca solutie de stabilire a sexului unei persoane intr-o aplicatie reala. Ar fi destul de jenant sa-i propui lui Horia un costum de baie din doua piese sau sa-i amintesti lui Irene sa-si controleze prostata :D

#9
Mosotti

Mosotti

    Geniu umil

  • Grup: Senior Members
  • Posts: 30,606
  • Înscris: 21.04.2004
  • ID membru: 14,919
  • Locație: ?

View Posttavitu, on 26 iunie 2017 - 10:43, said:

Dacă e să luăm așa, în lumea reală, e inutil un astfel de program, există nume unisex la care nu ai ce să le faci, iar în funcție de nevoile clientului pot fi mai mult de două sexe (M, F, secret, etc),
Sa nu mai vobim de retardatii aia cu LGBTIQ. Transgender nonbinary partially asexual special snowflake. Identifici gresit dupa nume un asemenea specimen si te-a luat dracu...

#10
IllusiveMan

IllusiveMan

    Junior

  • Grup: Members
  • Posts: 217
  • Înscris: 02.07.2017
  • ID membru: 991,723
"abc".endsWith(String.valueOf('a'); 
true

String.valueOf(ceva) "converteste" aproape orice ar fi acel ceva in string (de fapt creeaza un string nou si-l returneaza)

insa e mai simpla si mai eficienta testarea ultimului caracter cu
str.charAt(str.length() -1 ) == 'a'
(str e variabila de tip String)

#11
lightpoint

lightpoint

    Member

  • Grup: Members
  • Posts: 665
  • Înscris: 16.02.2017
  • ID membru: 979,869

View Postcosmin35, on 26 iunie 2017 - 09:29, said:

Salut,

Se poate verifica daca un String se termina cu un anumit caracter? Am incercat cu endsWith dar accepta doar alt string nu un caracter.
Vreau sa verific daca un nume se termina cu 'a' sa imi afiseze mesajul ca acel nume este de "Fata" else "Baiat". Posted Image

Multumesc
String str = "strigul tau mirific si nemaipomenit";
if ( str.length >1) {
	 String result = str + " este nume de " + (str.toCharArray()[str.length-1] == 'a' ) ? "fata" : "baiat";
}else {
	println("error! stringul meu mirific si nemaipomenit este prea mic";
}


Edited by lightpoint, 16 July 2017 - 09:48.


#12
lightpoint

lightpoint

    Member

  • Grup: Members
  • Posts: 665
  • Înscris: 16.02.2017
  • ID membru: 979,869

View PostIllusiveMan, on 02 iulie 2017 - 14:52, said:

"abc".endsWith(String.valueOf('a'); 
true
Asta este varianta  scolareasca sau acolo unde userul nostru verifica cel mult sute de linii deoarece
endsWith foloseste regex sub capota. De asemenea daca  ii dai  endsWith(""),  da true.

De asemeni sa stii ca poti sa-ti faci propria implementare a lui endsWith(....) fara regex si caruia
daca ii dai un sir vid nu returneaza true ( ca efect secundar al regexului  folosit mai sus )

View Posttavitu, on 26 iunie 2017 - 10:43, said:

Dacă e să luăm așa, în lumea reală, e inutil
solutie data de tine cu seturi.

View Postdanvlas, on 26 iunie 2017 - 09:40, said:

Sau Carmen?
tocmai i-a schimbat sexul. Mai rar un astfel de program: daca nu este fata desi e fata , atunci trebuie sa nu mai fie fata.

Edited by lightpoint, 16 July 2017 - 10:28.


#13
lightpoint

lightpoint

    Member

  • Grup: Members
  • Posts: 665
  • Înscris: 16.02.2017
  • ID membru: 979,869
PS: pt initiator:
daca vrei sa folosesti solutia data de mine pentru zeci/sute de mii sau milioane de inregistrari, atunci in locul concatenarii cu "+" a stringurilor foloseste
un StringBuilder

#14
tavitu

tavitu

    Active Member

  • Grup: Members
  • Posts: 1,443
  • Înscris: 16.02.2009
  • ID membru: 420,799

View Postlightpoint, on 16 iulie 2017 - 10:02, said:

Asta este varianta  scolareasca sau acolo unde userul nostru verifica cel mult sute de linii deoarece
endsWith foloseste regex sub capota. De asemenea daca  ii dai  endsWith(""),  da true.
De unde știi că endsWith() folosește regex?
Eu văd că nu folosește regex http://grepcode.com/...va.lang.String)

Soluția propusă face o copie completă a fiecărui string într-un array de char doar ca să poți folosi indexarea (array[index]) pentru a accesa un singur caracter. Pentru cineva care se plânge de eficiență, soluția oferită este destul de ineficientă. Mai ales că există funcția charAt().

View Postlightpoint, on 16 iulie 2017 - 10:02, said:

solutie data de tine cu seturi.
tocmai i-a schimbat sexul. Mai rar un astfel de program: daca nu este fata desi e fata , atunci trebuie sa nu mai fie fata.
Citește cu mai multă atenție.

set nume_baieti_cu_a = {Luca, ...}
set nume_fete_fara_a = {Carmen, ...}

daca nume_test in nume_baieti_cu_a
    intoarce baiat
daca nume_test in nume_fete_fara_a
    intoarce fata

daca nume_test se termina in 'a'
    intoarce fata
altfel
    intoarce baiat

A fost o soluție foarte simplă pentru un începător în Java.

#15
IllusiveMan

IllusiveMan

    Junior

  • Grup: Members
  • Posts: 217
  • Înscris: 02.07.2017
  • ID membru: 991,723

View Postlightpoint, on 16 iulie 2017 - 10:02, said:

Asta este varianta  scolareasca sau acolo unde userul nostru verifica cel mult sute de linii
E varianta cu care userul a pornit si parea impotmolit.

View Postlightpoint, on 16 iulie 2017 - 10:02, said:

deoarece endsWith foloseste regex sub capota. De asemenea daca  ii dai  endsWith(""),  da true.
De asemeni sa stii ca poti sa-ti faci propria implementare a lui endsWith(....) fara regex si caruia
daca ii dai un sir vid nu returneaza true ( ca efect secundar al regexului  folosit mai sus )
Fals! endsWith nu foloseste niciun regex, ci apeleaza startsWith cu string-ul si un offset(care la randul sau nu foloseste regex)! Da, merge si endsWith("a") bine mersi.

Varianta cea mai eficienta cea cu charAt(str.length() - 1), nicidecum prin crearea unui nou array de caractere, care invoca System.arraycopy

Observ ca iti place sa contrazici sau sa dai sfaturi pe multe topicuri, nu de putine ori intepand alti participanti la discutie, fara insa sa ai cunostinte temeinice.

edit: n-am observat ca a postat si tavitu cam acelasi lucru

Edited by IllusiveMan, 16 July 2017 - 13:25.


#16
romio79

romio79

    Active Member

  • Grup: Members
  • Posts: 1,387
  • Înscris: 30.03.2005
  • ID membru: 33,589
  • Locație: bucuresti
@lightpoint ce ai dat tu e cea mai slaba solutie din cele postate aici

E nasol in schimb ca ai impresia ca e cea mai buna

#17
lightpoint

lightpoint

    Member

  • Grup: Members
  • Posts: 665
  • Înscris: 16.02.2017
  • ID membru: 979,869

View Posttavitu, on 16 iulie 2017 - 12:41, said:

Citește cu mai multă atenție.
set nume_baieti_cu_a = {Luca, ...}
set nume_fete_fara_a = {Carmen, ...}
daca nume_test in nume_baieti_cu_a
intoarce baiat
daca nume_test in nume_fete_fara_a
intoarce fata
daca nume_test se termina in 'a'
intoarce fata
altfel
intoarce baiat
A fost o soluție foarte simplă pentru un începător în Java.
Nu mai inteles.Nu are sens sa foloseste obiecte de tip Set(adica liste care se folosesc pentru
prelucrarea datelor) in cazul unor amarate de charuri. Aici facem selectie de un  element dintr-un array de char-uri.
Cand avem stocare folosim array-uri, cand avem prelucreare de date folosim liste.
Intr-o bucla mare de date, folosirea listelor trebuie justificata pentru ca mananca resurse.

View PostIllusiveMan, on 16 iulie 2017 - 13:12, said:

E varianta cu care userul a pornit si parea impotmolit.
Fals! endsWith nu foloseste niciun regex, ci apeleaza startsWith cu string-ul si un offset(care la randul sau nu foloseste regex)! Da, merge si endsWith("a") bine mersi.
Corect , mea culpa.

Quote

Varianta cea mai eficienta cea cu charAt(str.length() - 1),
Fals.  Uite aici codul sursa al metodei charAt(...)
public char charAt(int index) {
	 if ((index < 0) || (index >= value.length)) {
		 throw new StringIndexOutOfBoundsException(index);
	 }
	 return value[index];
}

Inn java, sa folosesti o metoda care arunca posibile exceptii intr-o bucla la fel de rau ca regexp-patternurile folosite intr-o bucla.

Quote

nicidecum prin crearea unui nou array de caractere, care invoca System.arraycopy
Culmea este ca metoda propusa de tine invoca aceaisi metoda propusa de mine =))

codul sursa al metodei startsWith din clasa String:
	public boolean startsWith(String prefix, int toffset) {
		char ta[] = value; // <-atentie la linia asta
		int to = toffset;
char pa[] = prefix.value; // <- si la linia asta
		int po = 0;
		int pc = prefix.value.length;
		// Note: toffset might be near -1>>>1.
		if ((toffset < 0) || (toffset > value.length - pc)) {
			return false;
		}
		while (--pc >= 0) {
			if (ta[to++] != pa[po++]) {
				return false;
			}
		}
		return true;
	}

Constructorul clasei String pe care il apeleaza JVM(vezi la sfarsitul postului de ce si cum ) :
public String(char[] value) {
	 this.value = Arrays.copyOf(value, value.length);
}


public static char[] copyOf(char[] original, int newLength) {
char[] copy = new char[newLength];
System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength)); // ia uite pe cine avem noi aici
	 return copy;
}

Ai inteles ceva ? Presupunand ca nu , atunci mai este nevoie sa-ti zic ca daca in java scriu  
String tavitu = "habar n-are"
, JVM-ul vine si face asa:
char[] a = { 'h','a', 'b', 'a', 'r',' ',' n',' -',' a', 'r', 'e'} si apoi apelaza clasa String cu constructorul avand signatura String(char[]) care, conform codului de mai sus, apeleaza System.arraycopy

Edited by lightpoint, 17 July 2017 - 12:42.


#18
lightpoint

lightpoint

    Member

  • Grup: Members
  • Posts: 665
  • Înscris: 16.02.2017
  • ID membru: 979,869

View Postromio79, on 16 iulie 2017 - 13:42, said:

@lightpoint ce ai dat tu e cea mai slaba solutie din cele postate aici

E nasol in schimb ca ai impresia ca e cea mai buna
Ura si la gara.Invata JDK-ul si apoi mai vorbim.

Anunturi


0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users