Jämföra två strängar ? [Java]

Permalänk
Medlem

Jämföra två strängar ? [Java]

Hej

Sitter med mitt javaprogram och försöker jämföra två strängar.

Problemet är att det inte går. För de strängar jag skriver in blir aldrig lika trots att de är lika. Undrar då om det blir något fel när man skriver in de med Scannern. Har använt line.separator och nextline men inget fungerar då man skriver först in namn och sen ett personnummer. Namnet har ett mellanslag men inte personnumret. Dock går det inte jämföra när man skriver in de två gånger. Lagrar det första i en klass som har hand om namnet och personnumret. Sen när jag anropar get-metoden för Strängen så står det korrekt men när man jämför blir det inte så att säga true!

/* Personnummer matas in som 10 siffror utan bindestreck */ Scanner scanner = new Scanner(System.in); /* Förnamn och efternamn matas in som en String */ String lineSeparator = System.getProperty("line.separator"); scanner.useDelimiter(lineSeparator); String name; System.out.println("Skriv in ditt namn: "); name = scanner.next(); System.out.println("Skriv in ditt personnummer"); personNr = scanner.next();

//I klassen sen då har jag en funktion public boolean comparePersonNr(String aString) { if(personNr == aString) { return true; } else { return false; } }

Den blir alltid false oberoende på vad jag skriver in.

Så vart kan felet ligga anropar funktionen med

if(arrayCustomer.get(i).comparePersonNr(personNr)) { choice = 0; }

Någon som har något förslag vad jag kan ha glömt, för initierar man strängarna med en gång med personnumret "78********" tex då kan den om allt är förvalt men inte om man skriver in det.

Oerhört tacksam för svar och råd!

Visa signatur

ATX: Intel Core i5 4690k | Asus Z97-A | MSI R9 390 8GB | 2x Corsair DDR3 2133Mhz | Crucial BX480Gb | Corsair TX650W | Fractal Design Define R4
mITX: Intel Core i3 6100 | Asus B150I | 2x8Gb Corsair DDR4 2133Mhz | Samsung 850 Evo 500GB | Cooler Master V750 | Fractal Design Define Nano S

Permalänk
Medlem

public boolean comparePersonNr(String aString, String bString) { if(aString.equals(bString)) { return true; } else { return false; } }

Jag skulle nog gjort såhär istället.

För övrigt är nog problemet att du använder == och inte equals. Equals jämför inehållet, medans == jämför objectet.

Permalänk
Medlem

För att jämföra strängar i Java använder du String.equals(String). I ditt fall personNr.equals(aString)

EDIT:

if(arrayCustomer.get(i).comparePersonNr(personNr)) { choice = 0; }

Om du inte hade tänk göra något mer än att jämföra strängarna skulle du kunna skriva det så här:

if(arrayCustomer.get(i).equals(personNr)) { choice = 0; }

Då slipper du den extra omvägen.

Permalänk

Hej!
Mina javakunskaper är begränsade men jag vet iaf att man inte kan använda == till strängar utom man måste tillämpa .equals t.ex.

public class punktequals { public static void main(String args[]){ String a = "Hej"; String b = "Hej"; // första stringen följt utav ".equals(namnet på den andra stringen)" alltså inte "==" if(a.equals(b)){ System.out.println("Tja"); } else{ System.out.println("nej."); System.exit(0); } } }

Permalänk
Medlem

För att förklara det tydligare, när du använder == så jämför du om referenserna pekar mot samma objekt. Använder du equals, så jämför den om två objekt är likadana.

Visa signatur

| Corsair Crystal 460X | Z390-F | 9700K | ROG Ryujn 360mm | RTX 3080Ti | ROG Thor 850W | Vengeance Pro 3200mhz 16cl 16GB (2x8) | 970 Pro 2TB + 2xWD Black 4TB | ROG SWIFT PG279Q | Arctis 7 Pro Wireless | ROG Scope Deluxe red silent | ROG Chakram |

Permalänk
Medlem

För att sammanfatta vad som tidigare sagts, med metodsignatur identisk till din, och en gnutta smidigare:

public boolean comparePersonNr(String aString) { return personNr.equals(aString); }

För övrigt är metodnamnet kanske inte det bästa, då "compare" är för mångtydigt. Det är bra om man direkt kan förstå vad en metod gör bara genom att läsa namnet. Ett mer entydigt förslag vore kanske "matchesPersonNr" eller "equalsPersonNr".

Visa signatur

5950X, 3090

Permalänk
Medlem

Tackar så mycket för era svar, nu när jag ser det så kommer jag ihåg det! Hinner dock inte prova nu, men tror att ni alla har rätt

Visa signatur

ATX: Intel Core i5 4690k | Asus Z97-A | MSI R9 390 8GB | 2x Corsair DDR3 2133Mhz | Crucial BX480Gb | Corsair TX650W | Fractal Design Define R4
mITX: Intel Core i3 6100 | Asus B150I | 2x8Gb Corsair DDR4 2133Mhz | Samsung 850 Evo 500GB | Cooler Master V750 | Fractal Design Define Nano S

Permalänk
Medlem
Skrivet av fatalbert541:

Hej!
Mina javakunskaper är begränsade men jag vet iaf att man inte kan använda == till strängar utom man måste tillämpa .equals t.ex.

public class punktequals { public static void main(String args[]){ String a = "Hej"; String b = "Hej"; // första stringen följt utav ".equals(namnet på den andra stringen)" alltså inte "==" if(a.equals(b)){ System.out.println("Tja"); } else{ System.out.println("nej."); System.exit(0); } } }

Det lustiga är att i ditt exempel får man samma resultat med a == b

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Det lustiga är att i ditt exempel får man samma resultat med a == b

Det kan verka lustigt men det är som det ska. Kompilatorn (och till viss del den virtuella maskinen) tar och gör så att konstanta strängar, dvs sådana som står hårdkodade i koden, pekar till samma Sträng-objekt så att det inte allokeras onödigt med minne.

Om man (verkligen) vet vad man håller på med så kan man göra samma sak med "dynamiska" strängar genom String.intern()-funktionen. Använd den dock inte om ni inte är helt på det klara vad som är fördelar och nackdelar med metoden.

//C

Permalänk
Medlem
Skrivet av conio:

Det kan verka lustigt men det är som det ska. Kompilatorn (och till viss del den virtuella maskinen) tar och gör så att konstanta strängar, dvs sådana som står hårdkodade i koden, pekar till samma Sträng-objekt så att det inte allokeras onödigt med minne.

Om man (verkligen) vet vad man håller på med så kan man göra samma sak med "dynamiska" strängar genom String.intern()-funktionen. Använd den dock inte om ni inte är helt på det klara vad som är fördelar och nackdelar med metoden.

//C

Precis, det var därför jag tyckte att just det exemplet var lite lustigt. String.intern() kände jag faktiskt inte till, intressant

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

Det lustiga är att i ditt exempel får man samma resultat med a == b

haha oj sicken tabbe ^^

Ignorera detta inlägg alla! haha

Skickades från m.sweclockers.com