Prosím o radu! :) – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Prosím o radu! :) – Java – Fórum – Programujte.comProsím o radu! :) – Java – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
brunoczech0
Newbie
3. 12. 2013   #1
-
0
-

Ahoj,

napsal jsem si takový krátký prográmek, který nefunguje jak má.

I když zadám (např.) zelenou, tak mi to vypíše - Neplatná volba, zkuste to znovu.

Věřím, že se tu najde někdo, kdo mi pomůže.

package enumeratory;
import java.util.Scanner;

public class class01 {


public static enum barvy{Cerna, Cervena, Zelena, Modra, Zluta}


public static void main(String[] args) {
barva();
}



public static void barva() {



String y;
Scanner in = new Scanner(System.in);
System.out.print("Zadejte barvu: ");
y = in.nextLine();


if(y == "Cerna" || y == "Zelena" || y == "Cervena" || y == "Zluta" || y == "Modra") {

barvy barvicka = barvy.valueOf(y);
System.out.println("Vase barva je ");
System.out.println(barvicka);

} else {

            System.out.println("Neplatna volba, zkuste to znovu!");

barva();
}
}

}
Nahlásit jako SPAM
IP: 85.71.249.–
Reklama
Reklama
KIIV+42
God of flame
3. 12. 2013   #2
-
+1
-
Zajímavé

tusim ze java nejak moc nemusi porovnavani retezcu pomoci ==

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
brunoczech0
Newbie
3. 12. 2013   #3
-
0
-

#2 KIIV
A jak to mám teda vyřešit? :)

Nahlásit jako SPAM
IP: 85.71.249.–
Flowy0
Věrný člen
3. 12. 2013   #4
-
0
-

je pravda ze pre string je spolahlivejsia funkcia equals() ale porovnanie by malo tiez fungovat vo vecsine pripadov ... myslim ze skor bude problem v tom co vracia scanner ... presnejsie v tom ze (ak som spravne pochopil) nextLine() je skor ako line separator ... resp funguje skor tak ze ak si predtym nieco nacitaval tak v buffery este nieco zostane a nextLine je tu na to aby si to odstranil pripadne spracoval (hlavne line delimitery - predpokladam ze tvoje volanie vracia okrem tvojho zadania aj odriadkovanie) ... pre nacitavanie len formatovaneho vstupu je skor next() kde si mozes (je tam aj verzia bez patternu) aj zadat pattern cim este viac zvysis spolahlivost

osobne by som to riesil vypisom a vyberom podla cisla ak mas len obmedzeny zoznam ... ak ziadas aby uzivatel trafil presne tvoj retazec tak to neni nic moc ... navyse aj teba to moze dost nasrat ked o pol roka budes zadavat "cervena" namiesto "Cervena"

Nahlásit jako SPAM
IP: 78.98.144.–
https://github.com/Flowy
Řešení
z
~ Anonymní uživatel
268 příspěvků
3. 12. 2013   #5
-
0
-
Vyřešeno Nejlepší odpověď

Operátor == porovnává reference, tj. jestli obě odkazují na ten samý objekt. Na porovnání řetezců podle jejich obsahu je metoda String.equals().

y.equals("Cerna")
Nahlásit jako SPAM
IP: 78.156.159.–
Flowy0
Věrný člen
3. 12. 2013   #6
-
0
-

to je pravda ale kedze JVM vecsinou nevytvara novy string ak nejaky stary ma rovnaky obsah tak sa da pouzit aj porovnanie ci odkazuju na rovnaky objekt

		String a = "that", b = "that";
		System.out.println(a==b);
Nahlásit jako SPAM
IP: 78.98.144.–
https://github.com/Flowy
KIIV+42
God of flame
3. 12. 2013   #7
-
0
-

#6 Flowy
no kazdopadne je to blbe pokud se zrovna opravdu nesnazis porovnavat reference... + nacteni ze scanneru ti na 100% nemuze vratit uz existujici referenci

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Flowy0
Věrný člen
3. 12. 2013   #8
-
0
-

#7 KIIV
ok sry ... preco scanner nespravi odkaz na uz existujuci string?

Nahlásit jako SPAM
IP: 78.98.144.–
https://github.com/Flowy
KIIV+42
God of flame
3. 12. 2013   #9
-
0
-

#8 Flowy
podle me by to bylo extremne pomale - otestovat vsechny uz definovane stringy a pak kdyztak hodit referenci, pokud se nejaky rovna...

Ikdyz je pravda, ze by to zase sedlo k "Java" pristupu :D

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Flowy0
Věrný člen
3. 12. 2013   #10
-
0
-

cize dovod preco  

		String a = "that", b = "that";
		System.out.println(a==b);

vracia true je pretoze sa to uprace pri preklade?

Nahlásit jako SPAM
IP: 78.98.144.–
https://github.com/Flowy
KIIV+42
God of flame
3. 12. 2013   #11
-
0
-

#10 Flowy
s velice vysokou pravdepodobnosti ano :)

a mozna i pro zmateni programatoru zacatecniku :)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
brunoczech0
Newbie
3. 12. 2013   #12
-
0
-

Vůbec nechápu o čem tu mluvíte :D

No nic, následující 2 hodiny zřejmě strávím přemýšlením nad tím, co to tu melete :D

Nahlásit jako SPAM
IP: 85.71.249.–
KIIV+42
God of flame
3. 12. 2013   #13
-
0
-

#12 brunoczech
jen o tom ze  ==  se neda pouzit na porovnavani obsahu retezcu v jave :)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
brunoczech0
Newbie
3. 12. 2013   #14
-
0
-

Takze na to mám jít přes equals?

Nahlásit jako SPAM
IP: 85.71.249.–
brunoczech0
Newbie
3. 12. 2013   #15
-
0
-

 Tak jsem to vyřešil takhle: (Kdybych věděl, že nějaký equals existuje, dřív. Tak bych se s tim nemusel tak srát :D)

package enumeratory;
import java.util.Scanner;

public class class01 {
	
	
	public static enum barvy{Cerna, Cervena, Zelena, Modra, Zluta}
	
	
	public static void main(String[] args) {
		barva();
	}
	
	
	
	public static void barva() {
		
		
		String[] x = new String[5];
		x[0]="Cervena";
		x[1]="Cerna";
		x[2]="Zelena";
		x[3]="Modra";
		x[4]="Zluta";
		
		
		String y;
		Scanner in = new Scanner(System.in);
		System.out.print("Zadejte barvu: ");
		y = in.next();
		
		
		if(y.equals(x[0]) || y.equals(x[1]) || y.equals(x[2]) || y.equals(x[3]) || y.equals(x[4]) ) {
			
			barvy barvicka = barvy.valueOf(y);
			System.out.print("Vase barva je ");
			System.out.println(barvicka);
			System.out.println("-------------------------------------\nProgram zacal odznovu\n");
			barva();
		
		} else {
			
            System.out.println("Neplatna volba, zkuste to znovu!");
			
			barva();
			}
	}

}
Nahlásit jako SPAM
IP: 85.71.249.–
KIIV+42
God of flame
3. 12. 2013   #16
-
0
-

teoreticky muzes vyuzit i to, ze valueOf vyhodi vyjimku, kdyz ta polozka neni v seznamu.. kdyz se to dobre odchyti, tak ani nemusis pouzivat ty equals (a ani if kdyz se to tak veme)

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
lukber0
Newbie
4. 12. 2013   #17
-
0
-

Udělal bych to takto:

...

if("Cerna".equalsIgnoreCase(y) || 
	"Zelena".equalsIgnoreCase(y) ||
	"Cervena".equalsIgnoreCase(y) ||
	"Zluta".equalsIgnoreCase(y) ||
	"Modra".equalsIgnoreCase(y)){
  ...
}
...

bude to chodit i v případě, že y bude null + case insensitive

Nahlásit jako SPAM
IP: 193.85.250.–
sleepy
~ Anonymní uživatel
422 příspěvků
4. 12. 2013   #18
-
0
-

Pouzi radsej switch case, je to asi rovnako modularne ako toto co si napisal, kontrolujes tam veci len raz, ke to zrozumitelnejsi kod a napises toho menej: 

String farba;
switch(farba.toLowerCase()){
	case "cierna":
		....
		break;
	case "cervena":
		... // kod
		break;
	...

	default:
		// co sa ma stat ak ziadna farba nvyhovie
}
Nahlásit jako SPAM
IP: 147.175.177.–
sleepy
~ Anonymní uživatel
422 příspěvků
4. 12. 2013   #19
-
0
-

inak naco najskor overujete ci je jednou z nich, v tomto pripade je to uplne zbytocne.

Nahlásit jako SPAM
IP: 147.175.177.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 39 hostů

Podobná vlákna

Prosim o radu — založil

Prosím o radu — založil Goumba

Prosim RADU — založil Mikys

Prosím o radu — založil Xmanik

Prosím o radu — založil Tom

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý