Chars in java

Moderators: jkien, Xilvo

Gebruikersavatar
Berichten: 7.390

Chars in java

Hoi,

ik heb nog een vraagje:

Code: Selecteer alles

void charTest(char x, char y) {

// Arithmetic operators:

x = (char)(x * y);

}
Wat doet dit eigenlijk?

Als ik bijvoorbeeld "a" en "b" neem als argumenten, dan zegt Eclipse dat het type ervan String is en niet char...

En vermenigvuldigen van chars lijkt me ook vreemd?

Tenzij ik misschien bijvoorbeeld "3" en "5" invoer?
"C++ : Where friends have access to your private members." Gavin Russell Baker.

Berichten: 1.116

Re: Chars in java

Dat maakt van een getal een karakter.

Er zijn twee mogelijke interpretaties mogelijk, afhankelijk van de taal waarin je werkt.

Elk karakter in de PC-wereld heeft een getal. Hiervoor wordt vaak de unicode gehanteerd (java in elk geval wel voor zover ik weet, nl. modified UTF). Hoofdletter A heeft bijv. getal 97. Als jij dus het getal 97 cast naar een char zul jij hoofdletter A krijgen (dit is volgens mij de manier waarop java er mee omgaat).

De ander lijkt me niet zo relevant in deze. Namelijk het omzetten van een getal in een leesbaar getal. Maar volgens mij heb je in java dat je dan moet casten als string.

Het vermenigvuldigen van chars is helemaal niet zo vreemd. In C is een char bijv. gewoon een getaltype. Je kunt deze dan ook laten weergeven als getal, maar daarnaast ook als letter.

Vooral voor het encoderen, comprimeren, etc. is dit een handige manier.

Gebruikersavatar
Berichten: 5.609

Re: Chars in java

Als ik bijvoorbeeld "a" en "b" neem als argumenten, dan zegt Eclipse dat het type ervan String is en niet char...
Probeer eens 'x' en 'y' i.p.v. "x" en "y".

Die eerste zijn chars, die tweede zijn Strings.
What it all comes down to, is that I haven't got it all figured out just yet

And I've got one hand in my pocket and the other one is giving the peace sign

-Alanis Morisette-

Gebruikersavatar
Berichten: 5.609

Re: Chars in java

Maar volgens mij heb je in java dat je dan moet casten als string.
Dat lijkt me niet te kloppen. Getallen zijn geen superklasse van String, en dus gaat casten niet lukken. Ook is String geen primitief datatype. (Het is wel een datatype dat wat meer kan dan alle andere)

Casten als char zou wel lukken.
What it all comes down to, is that I haven't got it all figured out just yet

And I've got one hand in my pocket and the other one is giving the peace sign

-Alanis Morisette-

Gebruikersavatar
Berichten: 7.390

Re: Chars in java

Bedankt, ik had niet gedacht dat '' en "" verschil zou maken. Verwend door php ;)
"C++ : Where friends have access to your private members." Gavin Russell Baker.

Berichten: 1.116

Re: Chars in java

Getallen zijn geen superklasse van String, en dus gaat casten niet lukken.
Ok, zou heel goed kunnen ;) . Ik praat vanuit de C-, PHP- en VB.NET-wereld. Daar is alles net iets anders dan in Java. En ik zou weer moeite moeten doen om java volledig te snappen.

Zie hier overigens nog wel iets over casten in Java: http://www.michael-thomas.com/tech/java/ja...P_DataTypes.htm. Daar zie je ook duidelijk dat casten van een char naar bijv. int heel normaal is (is veel meer over te vinden overigens, maar deze kwam mij even goed uit vanwege het voorbeeld).

Gebruikersavatar
Berichten: 7.390

Re: Chars in java

Ja, het voorbeeld is illustratief ;)

Dank je!
"C++ : Where friends have access to your private members." Gavin Russell Baker.

Gebruikersavatar
Berichten: 7.390

Re: Chars in java

Code: Selecteer alles

import java.util.*;

import static net.mindview.util.Print.*;

public class VowelsAndConsonants {

public static void main(String[] args) {

Random rand = new Random(47);

for(int i = 0; i < 100; i++) {

int c = rand.nextInt(26) + ‘a’;

printnb((char)c + ", " + c + ": ");

switch(c) {

case ‘a’:

case ‘e’:

case ‘i’:

case ‘o’:

case ‘u’: print("vowel");

break;

case ‘y’:

case ‘w’: print("Sometimes a vowel");

break;

default: print("consonant");

}

}

}

}
Hier zit ik toch op vast hoor ;)

Ik dacht dat switch een integer wilde, en geen char?

Eclipse wil trouwens ook niet compilen...

Kan iemand me helpen alstublieft?

EDIT: voor de duidelijkheid: daarom verwachtte ik bij case ook geen '-tekentjes...

owel had ik bij int c een sommatie met a en niet met 'a' verwacht...
"C++ : Where friends have access to your private members." Gavin Russell Baker.

Berichten: 1.116

Re: Chars in java

Wellicht even wat meer inspringen. Ik ga niet door code heen werken die allemaal niet netjes geformatteerd is. Hoe kort het dan ook is...

Switch is geen functie, maar language-construct. Dit heeft dus niets te maken met datatypes. Switch verwacht dus ook niet een specifiek datatype...

Nu vergelijk je overigens wel een integer met een char, is dat nodig...?

Gebruikersavatar
Berichten: 7.390

Re: Chars in java

Sorry de formatting is niet goed gekopieerd :s
The switch statement is a clean way to implement multiway selection (i.e., selecting from

among a number of different execution paths), but it requires a selector that evaluates to an

integral value, such as int or char. If you want to use, for example, a string or a floating

point number as a selector, it won’t work in a switch statement. For non-integral types, you

must use a series of if statements.

Code: Selecteer alles

//imports

import java.util.*;

import static net.mindview.util.Print.*;

public class VowelsAndConsonants {

   public static void main(String[] args) {

   Random rand = new Random(47);

   for(int i = 0; i < 100; i++) {

   int c = rand.nextInt(26) + ‘a’;

   printnb((char)c + ", " + c + ": ");

 switch(c) {

   case ‘a’:

   case ‘e’:

   case ‘i’:

   case ‘o’:

   case ‘u’: print("vowel");

break;

   case ‘y’:

   case ‘w’: print("Sometimes a vowel");

 break;

   default: print("consonant");

   }

  }

}

}
Nu vergelijk je overigens wel een integer met een char, is dat nodig...?
Wat bedoel je?
"C++ : Where friends have access to your private members." Gavin Russell Baker.

Berichten: 1.116

Re: Chars in java

Werkt het wel als je er gewoon een serie van ifs van maakt?

Daarnaast, waarom niet gewoon zo:

Code: Selecteer alles

if("aeiou".indexOf(c) <> -1) print("vowel");

elseif("yw".indexOf(c) <> -1) print("Sometimes a vowel");

else print("consonant");
If you want to use, for example, a string or a floating point number as a selector, it won’t work in a switch statement.
Vaag, ken de taal niet. Maar als ik al zoek op `integral types Java` krijg ik ook verschillende antwoorden. Wat dat betreft vaag...

Overigens zijn zowel char als integer integrale datatypen. Zoals al eerder aangegeven: allebei zijn in principe getallen.

Gebruikersavatar
Berichten: 7.390

Re: Chars in java

Ja, ik zou intuïtief ook een constructie zoals die van jou verkiezen. Ik heb het voorbeeldje uit het handboek daarom gequoted.

En ik begrijp idd zoals je eerder uitlegde dat het beiden integrale typen zijn, maar niet waarom je dan per se de '' gebruikt. Ik dacht dat je daarmee een letter krijgt (die overeenkomt met een integrale waarde).

Ik bedoel dus dat ik gewoon '' verwacht, ofwel:

-zowel binnen switch() als na case, of anders:

-noch binnen switch() noch na case

En niet:

switch( c )

case 'a'

omdat die c een int is en 'a' een char (wegens die expliciete '').

Maar het begint te komen, bedankt.
"C++ : Where friends have access to your private members." Gavin Russell Baker.

Berichten: 1.116

Re: Chars in java

En ik begrijp idd zoals je eerder uitlegde dat het beiden integrale typen zijn, maar niet waarom je dan per se de '' gebruikt. Ik dacht dat je daarmee een letter krijgt (die overeenkomt met een integrale waarde).
Om het verschil uit elkaar te houden tussen string en char. Al vind ik het persoonlijk ook een beetje onzin. Als ik dit doe:

Code: Selecteer alles

char dag = "a";
Zou het mijns inziens logisch zijn dat de interpreter gelijk herkent: tsjoh, hij wil dat het een char wordt.

Hetzelfde geldt voor:

Code: Selecteer alles

int dag = 121 + "a";
Maar ja, wij zijn niet degenen die het verzonnen hebben. Wellicht dacht men: door op deze manier scheiding te maken, blijft iedereen een beetje wakker en blijft iedereen doorhebben dat het één in principe een getal is en het ander in principe een lap tekst.
Ik bedoel dus dat ik gewoon '' verwacht, ofwel:

-zowel binnen switch() als na case, of anders:

-noch binnen switch() noch na case
En ik snap niet wat je bedoelt en verwacht dus eigenlijk nog uitleg ;) .

Gebruikersavatar
Berichten: 7.390

Re: Chars in java

Waarom er niet staat switch( (char)c ).

Maar ik moet gewoon mijn manier van denken een beetje verruimen. Char is ook een integrale datatype. Dat volstaat eigenlijk als verklaring.

Dank je voor je antwoorden!
"C++ : Where friends have access to your private members." Gavin Russell Baker.

Berichten: 2

Re: Chars in java

Zelf ken ik nog geen Java (wel C++), maar ik heb even de tijd genomen om het een en ander op te zoeken.

Om terug te komen op je oorspronkelijke vraag. Het schrijven van een expressie als

Code: Selecteer alles

x = (char)(x * y);
noemt men explicit casting. Dit betekent dat je een entiteit van een bepaald datatype gaat omzetten in het door jou expliciet opgegeven type. Explicit casting is echter niet altijd nodig, vaak doet de compiler voor jou automatisch al een aantal omzettingen. Deze automatische conversies worden impliciete conversies of coercions genoemd.

In jou oorspronkelijk opgegeven code, was de explicit cast niet nodig. De compiler weet wel hoe hij een char maal een char, in een char moet omzetten. Als je een stukje code schrijft als

Code: Selecteer alles

int i = 5;

int j = 3;

int k;

k = i + j;
dan ga je ook niet schrijven

Code: Selecteer alles

int i = 5;

int j = 3;

int k;

k = int(i + j);
De compiler weet immers hoe hij hier mee moet omgaan. De compiler kan echter nog meer typeconversies automatisch uitvoeren. Een soort typeconversies dat de compiler bijvoorbeeld ook automatisch kan uitvoeren zijn de 'Widening Primitive Conversion'. Onder deze conversies vallen o.a. het omzetten van:

- een short in een int

- een int in een long

- een char in een int

- een long in een double

Als je wil weten wat er exact allemaal kan, kan je kijken op de site van Sun (zie hier onder puntje 5.1.2).

Je kan dus gerust een stukje code schrijven als

Code: Selecteer alles

int i = 5;

long j = i;

char c = 'a';

int d = c;
Omgekeerd heb je ook nog de 'Narrowing Primitive Conversions'. Dit is bv. het omzetten van:

- een int in een char

- een long in een int

Voor deze conversies zal je dus een explicit cast moeten doen. Je zal dus bv. moeten schrijven

Code: Selecteer alles

int i = 5;

char c = (char)i;

long i = 25;

int j = (int)i;
De reden waarom men bij de onderste voorbeelden explicit cast verplicht is gemaakt, is voor je eigen veiligheid. Stel dat je per ongeluk een reeel getal zou toekennen aan een geheel getal. Dan ben je ineens het deel achter de komma kwijt, wat soms niet wenselijk is. Omgekeerd kan het geen kwaad om een geheel getal aan een reeel getal toe te kennen.

Op deze website heb ik nog wat interessante dingen gevonden over het onderwerp. Je kan het eens lezen als je er in geïnteresseerd mocht zijn ](*,) .

Reageer