Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone

Monede JO 2024

Suprasolicitare sistem electric
 CIV auto import

Mutare in MOZAMBIC - pareri, expe...

Scoatere antifurt airtag de pe ha...

Magnet in loc de clește pent...
 Cumparat/Locuit in apartament si ...

Pot folosi sistemul PC pe post de...

Sokol cu distorsiuni de cross-over

Filtru apa potabila cu osmoza inv...
 Kanal D va difuza serialul “...

Upgrade xiaomi mi11

securitate - acum se dau drept - ...

Farmacia Dr Max - Pareri / Sugest...
 

Verificare ultimul caracter dintr-un String

- - - - -
  • Please log in to reply
28 replies to this topic

#1
cosmin35

cosmin35

    Junior Member

  • Grup: Members
  • Posts: 25
  • Înscris: 17.07.2007
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

    Minune: HE a început să emită facturile!

  • Grup: Senior Members
  • Posts: 5,598
  • Înscris: 16.02.2009
"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

    Guru Member

  • Grup: Senior Members
  • Posts: 11,118
  • Înscris: 04.06.2009
Si daca numele este Luca?
Sau Carmen?

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


#4
tavitu

tavitu

    Minune: HE a început să emită facturile!

  • Grup: Senior Members
  • Posts: 5,598
  • Înscris: 16.02.2009
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

    Guru Member

  • Grup: Senior Members
  • Posts: 11,118
  • Înscris: 04.06.2009
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

    Active Member

  • Grup: Members
  • Posts: 1,836
  • Înscris: 14.04.2005
https://www.tpu.ro/f...e-romana-stiti/

#7
tavitu

tavitu

    Minune: HE a început să emită facturile!

  • Grup: Senior Members
  • Posts: 5,598
  • Înscris: 16.02.2009
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

    Guru Member

  • Grup: Senior Members
  • Posts: 11,118
  • Înscris: 04.06.2009
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: 33,295
  • Înscris: 21.04.2004

 tavitu, 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

    Member

  • Grup: Members
  • Posts: 750
  • Înscris: 02.07.2017
"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: 785
  • Înscris: 16.02.2017

 cosmin35, 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: 785
  • Înscris: 16.02.2017

 IllusiveMan, 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 )

 tavitu, 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.

 danvlas, 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: 785
  • Înscris: 16.02.2017
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

    Minune: HE a început să emită facturile!

  • Grup: Senior Members
  • Posts: 5,598
  • Înscris: 16.02.2009

 lightpoint, 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().

 lightpoint, 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

    Member

  • Grup: Members
  • Posts: 750
  • Înscris: 02.07.2017

 lightpoint, 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.

 lightpoint, 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,655
  • Înscris: 30.03.2005
@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: 785
  • Înscris: 16.02.2017

 tavitu, 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.

 IllusiveMan, 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: 785
  • Înscris: 16.02.2017

 romio79, 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

Chirurgia endoscopică a hipofizei Chirurgia endoscopică a hipofizei

"Standardul de aur" în chirurgia hipofizară îl reprezintă endoscopia transnazală transsfenoidală.

Echipa NeuroHope este antrenată în unul din cele mai mari centre de chirurgie a hipofizei din Europa, Spitalul Foch din Paris, centrul în care a fost introdus pentru prima dată endoscopul în chirurgia transnazală a hipofizei, de către neurochirurgul francez Guiot. Pe lângă tumorile cu origine hipofizară, prin tehnicile endoscopice transnazale pot fi abordate numeroase alte patologii neurochirurgicale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate