==== Tömb mérete ====
int tomb[][] = new int[8][4];
System.out.println(tomb.length); // 8-at ír ki
System.out.println(tomb[0].length); // 4-et ír ki
==== Tömb átméretezése ====
A Java egyszerű tömbjeit nem arra találták ki, hogy később átméretezzük őket. Az átméretezés
azért megoldható:
int ujHossz = 20;
int eredetiHossz = tomb.length;
Class componentType = tomb.getClass().getComponentType();
Object tomb2 = Array.newInstance(componentType, ujHossz);
int vedettHossz = Math.min(eredetiHossz,ujHossz);
if (vedettHossz > 0)
System.arraycopy(tomb, 0, tomb2, 0, vedettHossz);
tomb = (int[]) tomb2;
A komplett program működés közben:
class tombmeret
{
private static Object resizeArray (Object oldArray, int newSize)
{
int oldSize = java.lang.reflect.Array.getLength(oldArray);
Class elementType = oldArray.getClass().getComponentType();
Object newArray = java.lang.reflect.Array.newInstance(
elementType,newSize);
int preserveLength = Math.min(oldSize,newSize);
if (preserveLength > 0)
System.arraycopy (oldArray,0,newArray,0,preserveLength);
return newArray;
}
public static void main(String[] args)
{
int[] tomb = new int[10];
tomb[0] = 35;
tomb[1] = 27;
tomb[2] = 42;
System.out.println(tomb.length);
tomb = (int[]) resizeArray(tomb, 20);
System.out.println(tomb.length);
}
}
Látjuk, hogy az ilyen egyszerű tömbök nem méretezhetők át könnyen. Ha méretezhető tömböt
szeretnénk, akkor használjuk az ArrayList vagy a Vector osztályt, az util
csomagból. Ezek átméretezése automatikus.
==== Tömb feltöltése ====
Az Arrays osztály arra való, hogy tömbökön végezzünk néhány műveletet.
Ez lehet annak feltöltése.
int[] tomb = new int[10];
java.util.Arrays.fill(tomb, 0);
==== Tömb paraméterként kezdőértékkel ====
method(new Object[] { a, b, c});
==== Egyéb tömbök ====
=== ArrayList ===
Az java.util.ArrayList dinamikus tömböt valósít meg.
A tömblisták (ArrayList) automatikusan átméreteződnek,
mérete mindig az elemek számától függ.
Az egyes elemeket mindössze fel kell venni vagy törölni.
Egy ilyen változó (objektum) deklarálásánál meg kell adnunk milyen
típusú elemet szeretnénk tárolni kisebb-mint és nagyobb-mint
jelek között. A következő példában például karaktersorozatot
szeretnénk tárolni:
ArrayList tomb = new ArrayList();
Vagy egészek tárolása
ArrayList tomb = new ArrayList();
Lássuk az alábbi példában egy komplett programot:
import java.util.*;
class Program
{
public static void main(String[] argv)
{
ArrayList tomb = new ArrayList();
tomb.add("eper");
tomb.add("málna");
tomb.add("barack");
System.out.println(tomb.get(2));
}
}
Az ArrayList tartalmának kiíratása:
ArrayList lista = new ArrayList<>();
lista.add('János');
lista.add('Mihály');
lista.add('Imre');
System.out.println(lista);
=== Vector ===
Az ArrayList-et egyszálas programokhoz tervezték. A Vectort többszálas programokhoz.
A Vector nem ellenőrzi, ha a kollekciója megváltozik, ami hibákhoz vezethet.
megváltozhat az iteráció során, viszont a változás nem
ellenőrzött.
A vektor az ArrayList-hez hasonlóan használható. Meg kell adnunk mit szeretnénk benne tárolni.
A következőben lássunk egy komplett példát a használatára.
import java.util.*;
class Program2
{
public static void main(String[] argv)
{
Vector tomb = new Vector();
tomb.add("eper");
tomb.add("málna");
tomb.add("barack");
System.out.println(tomb.get(2));
}
}
Elem törlése
tomb.remove(1);
Ha Object típust adok meg akkor különböző típusokat is eltehetek a verembe.
import java.util.*;
class Program3
{
public static void main(String[] argv)
{
Vector
Egyéb metódusok használat közben:
import java.util.*;
class Program4
{
public static void main(String[] argv)
{
Vector tomb = new Vector();
tomb.add("eper");
tomb.add(25);
tomb.add("malna");
tomb.add("barack");
tomb.addElement("korte");
System.out.println(tomb.get(1));
System.out.println(tomb.size());
System.out.println(tomb.remove(1));
System.out.println(tomb.size());
System.out.println(tomb.get(1));
System.out.println(tomb.elementAt(2));
System.out.println("Hol talalhato: " + tomb.indexOf("malna"));
tomb.clear();
System.out.println(tomb.size());
tomb.addElement(new Integer(1));
tomb.addElement(new Integer(2));
System.out.println("Utolso: " + tomb.lastElement());
System.out.println("Elso: " + tomb.firstElement());
tomb.removeAllElements();
tomb.addElement("Valami");
tomb.addElement("Masik");
//Konverziók:
Object[] tomb2 = tomb.toArray();
String[] tomb3 = new String[10];
tomb3 = (String []) tomb.toArray(tomb3);
//Itt gond, ha a vektor nem string típusú elemet tartalmaz
//Olyankor Object típusba lehet konvertálni.
Enumeration e = tomb.elements();
}
}
Ha Vector és hasonló listák esetén, ha számot akarunk tárolni akkor nem
használhatjuk a primitív típust, helyette a burkolóosztályt kell használnunk.
Ugyanakkor a for ciklusnak használhatjuk egy újabb változatát a lista kiíratására.
A következő példa ezt mutatja be:
import java.util.Scanner;
import java.util.Vector;
class Program
{
public static void main(String args[])
{
Vector szamok = new Vector();
szamok.add(37);
szamok.add(52);
szamok.add(48);
szamok.add(87);
szamok.add(23);
for(Integer szam : szamok)
System.out.print(szam + " ");
System.out.println();
}
}
Vegyük észre az "Integer"-t az "int" helyett, a for ciklus
fejrészében pedig "Integer szam : szamok". Utóbbi azt jelenti, hogy
veszem a szamok list minden elemét. Az elemeket a szam változóban kapom meg
minden ciklusban, ameddig a lista elemei el nem fogynak.
=== List ===
A List egy Interfész, ezért példányt nem lehet belőle létrehozni.
A konstruktorként az előző osztályok valamelyikét használhatjuk.
A következő példában a Vector<> osztályt használjuk konstruktorként.
import java.util.*;
class Program5
{
public static void main(String[] argv)
{
List tomb = new Vector();
tomb.add("eper");
tomb.add("málna");
tomb.add("barack");
System.out.println(tomb.get(1));
}
}
Használható típussal egyszerre több típus.
=== Set ===
A Set egy interface, nem osztály.
Ezért nincs is konstruktora. Helyette a TreeSet vagy HashSet osztályok konstruktorát
használjuk. Egy halmazt határozhatunk meg vele, amelyen a szokásos halmazműveletek
használhatók.
import java.util.*;
class Program6
{
public static void main(String[] argv)
{
//Set halmaz = new TreeSet();
Set halmaz = new HashSet();
halmaz.add("eper");
halmaz.add("málna");
halmaz.add("barack");
System.out.println(halmaz.size());
System.out.println(halmaz.contains("eper"));
Iterator it = halmaz.iterator();
while(it.hasNext())
{
Object elem = it.next();
}
}
}
=== Iterátor ===
import java.util.Iterator;
import java.util.Vector;
public class Program02
{
public static void main(String args[])
{
Vector v = new Vector();
v.add("alma");
v.add("körte");
v.add("barack");
v.add("szilva");
Iterator i = v.iterator();
while (i.hasNext())
{
System.out.println(i.next());
}
}
}
=== ArrayList kezdőérték ===
import java.util.ArrayList;
import java.util.Arrays;
class Program01
{
public static void main(String args[])
{
Integer[] t = {45, 37, 29, 82, 34, 56};
ArrayList v = new ArrayList(Arrays.asList(t));
for(Integer a : v)
System.out.println(a);
}
}
=== ArrayList listák összefűzése ===
List list = new ArrayList();
list.addAll(list1);
list.addAll(list2);
==== Gyakorlat ====
- Mondjon olyan típust vagy osztályt, amely azonos típusú elemek felvétele során automatikusan nő annak mérete.
- Milyen osztállyal tudunk feltölteni egy tömböt?
- Mi a vektor?
- Mi a mátrix?
- Hogyan deklarálunk egy mátrixot Java nyelven?
===== Különböző típusú adatok egy adatszerkezetben =====
A C nyelvben ezt struct, míg Pascal nyelvben ez a record.
A Java nyelvben ezek egyike sem használható, helyette
osztályt használhatunk a már meglévő osztályon belül.
import java.io.*;
class Program01
{
public static void main(String args[]) throws IOException
{
class Dolgozo
{
int kor;
double fizetes;
}
Dolgozo Joska = new Dolgozo();
Joska.kor = 23;
Joska.fizetes = 370000;
System.out.printf("%f\n", Joska.fizetes);
System.out.println("Folytatáshoz nyomjon egy billentyűt");
System.in.read();
}
}
vagy
import java.io.*;
class Program01
{
static class Dolgozo
{
int kor;
double fizetes;
}
public static void main(String args[]) throws IOException
{
Dolgozo Joska = new Dolgozo();
Joska.kor = 23;
Joska.fizetes = 370000;
System.out.printf("%f\n", Joska.fizetes);
System.out.println("Folytatáshoz nyomjon egy billentyűt");
System.in.read();
}
}
==== Osztály tömbként ====
Sokszor előfordulhat, hogy több különböző adatot szeretnénk tárolni de nem csak egy dologról vagy személyről hanem többről.
Például szeretnénk dolgozók adatait tárolni:
import java.io.*;
class Osztalytomb {
public static void main(String[] args) throws IOException {
Dolgozo[] munkas = new Dolgozo[3];
munkas[0] = new Dolgozo("Nagy Béla", 350000);
munkas[1] = new Dolgozo("Kis János", 750000);
munkas[2] = new Dolgozo("Rózsa Sándor", 380000);
for (int i = 0; i < 3; i++)
munkas[i].print();
System.in.read();
}
}
class Dolgozo {
private String nev;
private double fizetes;
public Dolgozo(String n, double s) {
nev = n;
fizetes = s;
}
public void print() {
System.out.println(nev + "\t" + fizetes);
}
}
Újabb példa:
class Program01 {
static class Dolgozo
{
String nev;
int kor;
double fizetes;
}
public static void main(String[] args) {
Dolgozo[] munkas = new Dolgozo[3];
for(int i=0; i<3;i++)
munkas[i] = new Dolgozo();
munkas[0].nev = "Nagy István";
munkas[0].kor = 25;
munkas[0].fizu = 285600.0;
munkas[1].nev = "Kis Béla";
munkas[1].kor = 32;
munkas[1].fizu = "Kis Béla";
munkas[2].nev = "Be Kornél";
munkas[2].kor = 22;
munkas[2].fizu = "Erős Lajos";
}
}
Harmadik példa
/* Több tulajdonság tárolása listában */
import java.util.ArrayList;
public class Program02 {
public static void main(String[] a) {
ArrayList dolgozok = new ArrayList();
dolgozok.add(new Dolgozok("Nagy", "József"));
dolgozok.add(new Dolgozok("Rezeg", "István"));
dolgozok.add(new Dolgozok("Kékedi", "János"));
System.out.println(dolgozok);
Dolgozok d = dolgozok.get(1);
d.beallitVezNev("Erős");
System.out.println(dolgozok);
Dolgozok d2 = dolgozok.get(1);
System.out.println(d2.lekerVezNev());
}
}
class Cim {
}
class Dolgozok {
private String vezNev;
private String kerNev;
private Double fizetes;
public Cim cim;
public Dolgozok(String vezNev, String kerNev) {
this.vezNev = vezNev;
this.kerNev = kerNev;
this.cim = new Cim();
}
public String lekerVezNev() {
return this.vezNev;
}
public void beallitVezNev(String vezNev) {
this.vezNev = vezNev;
}
public String lekerKerNev() {
return this.kerNev;
}
public void beallitKerNev(String kerNev) {
this.kerNev = kerNev;
}
public double lekerFizetes() {
return this.fizetes;
}
public void beallitFizetes(double fizetes) {
this.fizetes = fizetes;
}
}
Egy példa automatikus feltöltéssel:
class Szemely {
private String nev;
private int szuletesEve;
Szemely(String nev, int szuletesEve) {
this.nev = nev;
this.szuletesEve = szuletesEve;
}
@Override
public String toString() {
return nev + ":" + szuletesEve;
}
}
class Program01 {
public static void main(String args[]) {
Szemely[] szemelyek = new Szemely[5];
for(int i=0;i<5;i++) {
szemelyek[i] = new Szemely("Névtelen" + i, 0);
}
System.out.println(szemelyek[1].toString());
}
}
{{:oktatas:programozás:java:tombszemelyosztalybol.png|}}
Ha HashSet osztályba szeretnénk például egy Dolgozo osztály példányait tárolni, néhány dolog nem fog működni alapértelmezetten.
Ha például felveszem kétszer ugyanazt az adatot, mindkét adat tárolásra kerül, pedig halmazról lévén szó ennek nem lenne szabad
bekövetkeznie. Ha egy HashSet objektumba, amely például Integer értékeket tartalmaz, a 22 értéket kétszer adom hozzá az add()
metódussal, az csak egyszer fog tárolódni.
Visszatérve a Dolgozo osztályunkhoz, hasonló probléma lép fel, ha meg akarom vizsgálni, hogy egy adott dolgozó szerepel-e már a halmazban.
Ezt a contains() metódussal szoktuk vizsgálni. Ha a HashSet halmazunkban a Dolgozo osztály példányai vannak a contains() metódus mindig hamis értéket fogunk kapni, vagyis nem tudjuk megvizsgálni vele, hogy egy adott dolgozó szerepel-e egy halmazban.
Természetesen a probléma megoldható, csak felül kell írnunk a hashCode() és a equals() metódust. A következő programban
erre látunk példát:
import java.util.HashSet;
class Dolgozo {
String nev;
int kor;
double fiz;
Dolgozo(String nev, int kor, double fiz) {
this.nev = nev;
this.kor = kor;
this.fiz = fiz;
}
@Override
public boolean equals(Object o) {
if(this == o) return true;
Dolgozo dolgozo = (Dolgozo) o;
if(!dolgozo.nev.equals(this.nev)) return false;
if(dolgozo.kor!=(this.kor)) return false;
if(dolgozo.fiz!=(this.fiz)) return false;
return true;
}
@Override
public int hashCode() {
int nevHash = this.nev.hashCode();
int korHash = this.kor;
int fizHash = (new Double(this.fiz)).hashCode();
int res = nevHash + korHash + fizHash;
return res;
}
}
class Program01 {
public static void main(String args[]) {
HashSet h = new HashSet();
h.add(new Dolgozo("Nagy József", 35, 350000));
h.add(new Dolgozo("Nagy József", 35, 350000));
System.out.println(h.contains(new Dolgozo("Nagy József", 35, 350000)));
System.out.println(h.size());
}
}
===== Enum típusok =====
Az enum típus egy speciális típus, amellyel a nevesített állandókhoz hasonló
típusok jönnek létre. Egy ilyen típus több nevet tartalmaz. Értéket azonban nem adunk nekik, csak a nevükkel hivatkozunk rájuk. Használatával **olvashatóbb kódot** kapunk.
enum Egtaj {
ESZAK, DEL, KELET, NYUGAT
}
enum Os {
LINUX, WINDOWS, MACOSX
}
class Program
{
enum Nap {
HETFO, KEDD, SZERDA, CSUTORTOK,
PENTEK, SZOMBAT, VASARNAP
}
public static void main(String[] args)
{
Nap a = Nap.HETFO;
System.out.println(a);
}
}
==== Dolgozók státusza ====
Legyen egy példa, ahol dolgozók adatait tároljuk, köztük a dolgozó státuszát. A státusz lehet aktív, próbaidős, szabadságos, beteg, megszüntetés alatt.
A státuszok nyilvántartására készítünk egy enum típust:
public enum Status {
TRIAL,
ACTIVE,
HOLIDAY,
SICK,
TERMINATE
}
A dolgozók tárolásánál ezt használjuk:
public class Employee {
int id;
String name;
String city;
double salry;
Status status;
}
Dolgozó státuszának beállítása:
public class App {
public static void main(String[] args) throws Exception {
handleEmp();
}
public static void handleEmp() {
Employee emp = new Employee();
emp.status = Status.ACTIVE;
System.out.println(emp.status);
}
}
A lehetséges kimenet:
ACTIVE
A dolgozók státuszát tárolhattuk volna String típusban is, de amikor értéket kell adni neki:
emp.status = "active";
El kell gondolkodnunk, hogy most akkor mit kell pontosan írni? Acitve, active, aktív, ACTIVE, esetleg working vagy más?
Ha enum típust használunk a fordító vagy maga a fejlesztő eszköz szól, ha elírtuk.
==== Még több ====
További lehetséges enum típusok
Még több:
enum Day {SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
enum Nap {HETFO, KEDD, SZERDA, CSUTORTOK, PENTEK, SZOMBAT, VASARNAP} ;
enum MovieType {ACTION, HORROR, COMEDY};
enum Gender {MALE, FEMALE};
enum WeekDay { MON, TUE, WED, THU, FRI, SAT, SUN };
enum Grade { A, B, C, D, F, INCOMPLETE }; //Ertekeles
enum Tank { EMPTY, HALF, FULL };
//Penny =1 centes, Nickel=5 centes, Dime=10 centes, Quarter=25 centes ; Amerika
enum Currency {PENNY, NICKLE, DIME, QUARTER};
enum Color {WHITE, BLACK, RED, YELLOW, BLUE };
enum Planet {
MERCURY, VENUS, EARTH, ARS,
JUPITER, SATURN, URANUS, NEPTUNE};
//sugár km, tömeg kg.
enum Bolygo {
MERKUR (2439.7, 3.302E+23),
VENUSZ (6051.8, 4.8685E+24),
FOLD (6378.137, 5.9736E+24),
MARS (3402.5, 6.4185E+23),
JUPITER (71492.0, 1.899E+27),
SZATURNUSZ (60268, 5.6846e+26),
URANUSZ (25559, 8.6832e+25),
NEPTUNUSZ (24764, 1.0243e+26);
private final double radius;
private final double mass;
Bolygo(double radius, double mass){
this.radius = radius;
this.mass = mass;
}
private double getRadius() { return radius;}
private double getMass() { return mass;}
}
===== Karakterkezelés =====
==== ASCII ====
A char típus egy karakter tárolására való. Igaz a Java Unicode karaktereket
tárol, de az angol ábécé betűi az UTF-8 megvalósítás esetén
kompatibilisek az [[:oktatas:számítástechnika:ascii_tábla|ASCII]] kódtáblával.
Ha tudjuk, hogy az ASCII kódtáblában a nagy "A" és a kis "a" közötti
különbség 32, akkor egyszerűen alakíthatjuk a nagybetűs karaktereket
kisbetűssé és fordítva:
class ascii
{
public static void main(String args[])
{
char ch = 'A';
System.out.printf("%c\n", ch + 32);
}
}
A példában a nagy "A" karaktert kis "a" karakterré alakítjuk.
Rendelkezésre állnak a Character osztály metódusai is:
Kisbetűssé alakítása
char ch = Character.toLowerCase('A');
Szám, karakterként kezelése továbbiakban:
int a = 65;
char ch = (char) a;
A Character osztály további metódusai:
| boolean isDigit(char ch) |
| boolean isLetter(char ch) |
| boolean isLetterOrDigit(char ch) |
| boolean isWhitespace(char ch) |
| boolean isLowerCase(char ch) |
| boolean isUpperCase(char ch) |
| String toString() |
| String toString(char c) |
| char toUpperCase(char ch) |
class Program01 {
public static void main(String args[]) {
System.out.println(Character.toChars(97)); // a
System.out.println(Character.toChars(369)); // ű
System.out.println((char)97); // a
System.out.println((char)369); // ű
}
}
==== ASCII kód ====
A következő programban szeretnénk az "a" karakter ASCII kódját megkapni:
class Program01 {
public static void main(String args[]) {
char ch = 'a';
System.out.printf("%d\n", (int) ch);
}
}
Itt pedig van egy ASCII kódunk és szeretnénk kiíratni a hozzátartozó karaktert:
class Program01 {
public static void main(String args[]) {
int a = 65;
System.out.printf("%c\n", a);
}
}
Az "a" karaktert tárolhatjuk eleve **int típusban**:
class Program01
{
public static void main(String args[])
{
int a = 'a';
System.out.printf("%d\n", a);
}
}
Kódpontok kiíratása:
class Program01 {
public static void main(String args[]) {
System.out.println(Character.codePointAt("a", 0)); // 97
System.out.println(Character.codePointAt("é", 0)); // 233
System.out.println(Character.codePointAt("ű", 0)); // 369
}
}
==== Összehasonlítás, egyenlőség vizsgálat ====
Összehasonlításhoz használhatjuk a "==" az egyenlőségjeleket vagy ha burkolóosztályt használtunk, akkor equals() függvényt is.
class Program01 {
public static void main(String args[]) {
Character ch = 'a';
char ch2 = 'b';
System.out.println(ch.equals('a')); // true
System.out.println(ch == 'a'); // true
System.out.println(ch2 == 'b'); // true
}
}
class Program01 {
public static void main(String args[]) {
char ch1 = 'a';
char ch2 = 'a';
char ch3 = 'c';
System.out.println(Character.compare(ch1, ch2)); // 0
System.out.println(Character.compare(ch1, ch3)); // -2
System.out.println(Character.compare(ch3, ch1)); // 2
}
}
==== Karakter bekérés példa1 ====
A Scanner osztállyal közvetlenül nem kérhető be karakter. De bekérhetünk egy sztringet,
aminek vesszük az első karakterét.
import java.util.*;
class App {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
System.out.print("Karakter: ");
String str = sc.next();
char ch = str.charAt(0);
System.out.println(ch);
sc.close();
}
}
A next() metódus helyett használható a nextLine() metódus is.
==== Példa 2 ====
import java.io.*;
class App {
public static void main(String args[]) throws IOException {
System.out.print("Karakter: ");
char ch = (char) System.in.read();
System.out.println(ch);
}
}
==== Példa 3 ====
import java.io.*;
class Pel {
public static void main(String args[]) throws IOException {
InputStreamReader folyam = new InputStreamReader(System.in);
BufferedReader olvaso = new BufferedReader(folyam);
System.out.print("Karakter: ");
String str = olvaso.readLine();
char ch = str.charAt(0);
System.out.println(ch);
}
}
==== Sztring és karakter hasonlítása ====
class Program01 {
public static void main(String args[]) {
if(Character.toString('a').equals("a"))
System.out.println("Egyenlő");
else
System.out.println("Nem egyenlő");
}
}
==== Karaktertömb sztringgé ====
class Program01 {
public static void main(String args[]) {
//char tömb sztringgé 1:
char[] t = {'a', 'b', 'c'};
String s = new String(t);
System.out.println(s);
//char tömb sztringgé 2:
String s2 = String.copyValueOf(t);
System.out.println(s2);
}
}
===== Sztring kezelés =====
==== String osztály ====
Stringeket a String osztállyal hozhatunk létre. Nincs string primitív típus.
String s;
s = "alma";
A Java nyelvben a sztringváltozónak értékadással is adhatunk értéket.
A String osztály statikus, vagyis használható példányosítás nélkül.
A legnagyobb beírható string hossza: 65534
import java.io.*;
class Szoveg {
public static void main(String args[]) throws IOException {
String s;
s = "alma";
System.out.println(s.length());
System.in.read();
}
}
Egyenlőség vizsgálat
String gyumolcs = "körte";
if (gyumolcs.equals("alma"))
System.out.println("A gyümölcs alma");
==== String osztály metódusai ====
=== length() ===
A karaktersorozat hosszát adja vissza.
int hossz = s.length();
=== concat() ===
Karaktersorozatok összefűzésére való.
String s = "egyik";
s.concat(" másik");
Az s változót kiíratva ezek után ezt kapjuk:
egyik másik
=== replace() ===
Egy karaktersorozatban egy adott karaktersor cseréje egy másikra.
Általános szintaxis:
replace(mitCserél, mireCserél)
Egy konkrét példa:
String s = new String("Nagy kő esett le a szívemről tegnap");
System.out.print(s.replace("szívemről", "egy kocsiról"));
=== replaceAll() ===
Egy karaktersorozatban a megtalált mintát minden helyen kicseréli.
str.replaceAll("\\s+", "\t"); //Szóközök tabulátorra cserélése
=== toLowerCase() ===
Kisbetűssé alakít minden karaktert.
toLowerCase()
String str = "SziLVa";
String kisbetus = str.toLowerCase();
=== toUpperCase() ===
Nagybetűssé alakít minden karaktert.
toUpperCase()
String str = "SziLVa";
String nagybetus = str.toUpperCase();
=== trim() ===
A trim() a szöveg elejéről és a végéről eltávolítja a whitespace karaktereket.
String s = " alma ";
System.out.println(s.trim());
=== split() ===
A karaktersorozatot feldarabolja a megadott szeparátor alapján.
str.split("\\s+"); //Egy vagy több szóköz
Szeparátorként megadható szabályos kifejezés.
A split() függvény egy String[] típus ad vissza.
=== isEmpty() ===
Megvizsgáljuk, hogy a karaktersorozat-változó üres-e.
Példa:
boolean ures = str.isEmpty();
=== További példák ===
class Str {
public static void main(String args[]) {
System.out.println("Szövegkezelés Java nyelven");
String szoveg = "alma";
System.out.println(szoveg.equals("almaa")); // true értéket ad, ha egyezik, vagy false
System.out.println(szoveg.compareTo("alma")); // 0-át kapunk, ha egyezik
System.out.println(szoveg.indexOf("alma")); // -1 ha nem található;
// Ha szoveg változóban van ilyen annak a kezdő indexét kapjuk meg
// Esetünkben 0
//Szöveg darabolása
String sor ="alma:körte:barack:szilva";
String[] tomb = sor.split(":");
System.out.println(tomb[1]);
String mondat = "Ha megint ezért üzen";
System.out.println(mondat.substring(4)); //Kezdő indextől szeretném a karaktereket
System.out.println(mondat.substring(4, 6)); //Kezdő index és vég index közötti karakterek
}
}
==== char[] és String ====
A Sztring típusú objektum egy karakterére nem hivatkozhatunk a Java nyelven
szögletes zárójelekkel, mint egy tömbnél.
Sztring esetén a charAt() metódust használhatjuk.
Karakter tömb esetén a hivatkozás:
char[] tomb = {'a', 'b', 'c'};
System.out.println(tomb[1]);
Sztring esetén csak így:
String tomb = "abc";
System.out.println(tomb.charAt(1));
Esetleg, használjunk String() konstruktort:
char[] adat = {'a', 'b', 'c'};
String adat2 = new String(adat);
System.out.println(adat2.charAt(1));
==== Pufferelt sztringek ====
A string osztállyal létrehozott változó valójában nem változtatható meg.
Ha ilyen műveletet végzünk a háttérben valójában egy új példány jön létre.
String str = "szilva";
str = "barack";
A fenti példa második sorában a egy új str objektum jön létre a memóriában.
=== StringBuilder ===
Ugyanaz mint a StringBuffer, de a Stringek nincsenek szinkronizálva. Ezért használatát
egy szálas programokhoz találták ki.
StringBuilder defString = new StringBuilder(); // 16 karakter méret beállítása
StringBuilder nulString = new StringBuilder(6); // pontos méret megadása
StringBuilder aString = new StringBuilder("kezdőérték"); // kezdőérték megadása
Hozzátartozó metódusok:
capacity(), length(), charAt(i), indexOf(g), lastIndexOf(g)
Módosító metódusok:
append(g), delete(i1, i2), insert(iPosn, g), getChars(i), setCharAt(iposn, c),
substring(), replace(i1,i2,gvalue), reverse(), trimToSize(g ), toString(g)
Összehasonlítás String típussal:
if(strb.toString().equals("hasonlítószöveg"))
//Mit tegyünk
=== StringBuffer ===
StringBuffer s;
A StringBuffer osztállyal olyan sztringeket hozhatunk létre, amit meg is tudunk változtatni.
StringBuffer defString = new StringBuffer(); // 16 karakter méret beállítása
StringBuffer nulString = new StringBuffer(6); // pontos méret megadása
StringBuffer aString = new StringBuffer("kezdőérték"); // kezdőérték megadása
Hozzátartozó metódusok:
capacity(), charAt(i), length(), substring(iStart [,iEndIndex)])
Módosító metódusok:
append(g), delete(i1, i2), deleteCharAt(i), ensureCapacity(),
getChars(srcBeg, srcEnd, target[], targetBeg), insert(iPosn, g),
replace(i1,i2,gvalue), reverse(), setCharAt(iposn, c),
setLength(),toString(g)
==== Sztring formázás ====
Az alábbi sorok a Calander típusú objektum tartalmát teszik olvashatóvá:
java.util.Calendar c = java.util.Calendar.getInstance();
String s = String.format("Születésnap: %1$tY-%1$tm-%1$te", c);
Valós szám kiíratása:
double a = 3.7;
System.out.println(String.format("%.2f\n", a));
==== Összefűzés ====
String s1 = "Egyik";
String s2 = s1 + "Másik";
==== Sztring hossza ====
int hossz = s2.length();
==== Számok sztringgé ====
int szam1 = 4;
double szam2 = 3.5;
String szamegy = String.valueOf(szam1);
String szamketto = String.valueOf(szam2);
==== Sztringek számmá ====
String s1 = "3.5";
String s2 = "34";
double szam1;
int szam2;
szam1 = Double.valueOf(s1).doubleValue();
szam2 = Integer.alueOf(s2).intValue();
==== Összehasonlítás ====
String gyumolcs = "alma";
if (gyumolcs.equals("körte"))
System.out.println("A gyümölcs: körte");
Lexikográfiai összehasonlítás. 0-át kapunk ha azonos, 0-nál kisebb értéket ha
a második kisebb (lexikográfialilag), illetve 0-nál nagyobb értéket ha
nagyobb.
String abc = "abc";
Stirng def = "xyz";
if (abc.compareTo(def) < 0) // 'a' kisebb mint 'x'
if (abc.compareTo(abc) == 0) // ez is igaz
==== Egy adott karakter első előfordulása ====
String s = "Finomabb";
int kezdet;
kezdet = s.indexOf('b')
==== Egy adott sztring első előfordulása ====
String s = "Finomabb";
int kezdet;
kezdet = s.indexOf("nom")
==== Rész sztring ====
String s = "Finomabb";
String resz;
resz = s.substring(2,4);
Az első paraméter a kezdet, a második a vég.
==== Sztring karaktertömbbé ====
String s = "barack";
char[] t = s.toCharArray();
System.out.println(t[0]);
Iterálással:
class Program01 {
public static void main(String[] args) {
String str = "almakörte";
char[] ca = str.toCharArray();
for(char ch : ca) {
System.out.println(ch);
}
}
}
==== Sztring darabolása ====
String s = "barack:körte:alma";
String[] ts = s.split(":");
System.out.println(ts[1]);
A "|" szeparátorral nem működik. A Szeparátor lehet reguláris kifejezés is.
==== Gyakorlás ====
* Milyen osztályokkal deklarálhatunk karaktersorozatot tárolni képes változót, illetve objektumot?
* Hogyan kérdezhetjük le egy karaktersorozat hosszát?
* Hivatkozhatok-e egy karaktersorozat adott elemére a szögletes zárójelekkel, a tömbökhöz hasonlóan?
* Hogyan tudom egy szöveg egy részét venni?
* Hogyan tudom megvizsgálni, hogy egy karaktersorozat egyenlő-e egy másik karaktersorozattal?
===== Kivételkezelés =====
==== A kivételkezelésről ====
A kivételkezelést a program futtatása során fellépő abnormális állapotok kezelésére találták ki.
Abnormális állapot esetén a programok kivételt dobnak. Például, egy nemlétező állományra
hivatkozunk, vagy írni akarunk állományba, de nincs hozzá jogunk. Esetleg nullával próbáltunk
meg osztani.
Ha egy program dobott egy kivétel, mi két dolgot tehetünk. Eldobjuk vagy kezeljük.
Az eldobás a throws utasítással lehetséges. Az elkapás a try-catch utasítás párral.
==== Osztás nullával ====
import java.io.*;
import java.util.*;
class program
{
public static void main(String args[]) throws IOException
{
Scanner be =new Scanner(System.in);
double c=0;
int a = be.nextInt();
try {
c = 50 / a;
} catch (Exception e) {
if (e instanceof ArithmeticException)
System.out.println("Osztás nullával");
}
System.out.printf("%f\n", c);
System.out.println("Folytatáshoz nyomj egy billentyűt!");
System.in.read();
}
}
try{
//utasítások
}catch(IOException e) {
System.err.println("Kivétel törént - Hogy miért? Lásd itt: ");
e.printStackTrace();
System.exit(-1);
}
A kivétel eldobása:
import java.io.IOException;
class Program01
{
public static void main(String[] args) throws IOException
{
System.out.println("Folytatáshoz nyomjon Entert");
System.in.read();
}
}
==== Osztás 0-val lebegőpontos számokkal ====
Ha lebegőpontos számokkal dolgozunk és 0-val osztunk, akkor az nem hiba.
Ez csak egész számok esetén hiba. Valós számok esetén az eredmény végtelen.
class Program01 {
public static void main(String[] args) {
double a = 1/0.;
if(a == Double.POSITIVE_INFINITY) {
System.out.println("Végtelen");
} else {
System.out.println("Valami más");
}
}
}
==== Néhány kivétel ====
* ArithmeticException - Például osztás nullával
* InputMismatchException - java.util.Scanner osztállyal pl. számot várunk szöveget kapunk
==== Gyakorlat ====
* Mikor használjuk a kivételkezelést?
* Milyen utasítással alkalmazzuk a Java nyelvben a kivételkezelést?
===== Fájl műveletek =====
==== Műveletek fájlokkal ====
Fájl létezésének ellenőrzése:
import java.io.*;
public class ap
{
public static void main(String[] args)
{
File f = new File("adat.txt");
System.out.println(f.exists());
}
}
További metódusok:
* exists() -- Ha a fájl létezik true, ha nem false
* getName() -- A fájl neve String-ként
* length() -- A fájl mérete long-ként
* createNewFile() -- Azonos nevű fájl létrehozása, ha még nem létezik
* delete() -- A fájl törlése, ha létezik
* renameTo(Fájl) -- A fájl átnevezése a paraméterben megadott File objektumot használva.
A fájl objektum könyvtárakat is jelölhet.
Ha egy File objektum könyvtárat jelöl akkor hívható a következő metódus:
* listFiles()
==== Olvasás fájlból ====
=== Egyszerűen ===
import java.io.*;
class Program2 {
public static void main(String args[]) throws IOException {
FileReader olvaso = new FileReader("adat.txt");
StringBuilder strb = new StringBuilder();
char ch;
while(olvaso.ready()) {
ch = (char)olvaso.read();
strb.append(ch);
}
olvaso.close();
System.out.println(strb);
}
}
=== BufferedReader használata ===
import java.io.*;
class readfile
{
public static void main(String[] argv) throws IOException
{
FileReader folyam = new FileReader("adat.txt");
BufferedReader fileolvaso = new BufferedReader(folyam);
String sor;
while ((sor = fileolvaso.readLine()) != null)
{
System.out.println(sor);
}
fileolvaso.close();
}
}
=== Három osztály használata ===
import java.io.*;
public class ap {
public static void main(String[] args) throws IOException {
File f = new File("adat.txt");
FileReader fr = new FileReader(f);
BufferedReader bemenet = new BufferedReader(fr);
boolean vege = false;
String s;
while(!vege) {
s = bemenet.readLine();
if (s != null)
System.out.println(s);
else
vege = true;
}
bemenet.close();
}
}
=== Olvasás Scanner osztállyal ===
import java.io.*;
import java.util.*;
class readfile2
{
public static void main(String[] argv) throws IOException
{
Scanner olvaso = new Scanner(new FileReader("adat.txt"));
while(olvaso.hasNextLine())
{
System.out.println(olvaso.nextLine());
}
}
}
=== Újabb példa ===
import java.io.*;
class readfile
{
public static void main(String[] argv) throws IOException
{
FileReader folyam = new FileReader("adat.txt");
BufferedReader fileolvaso = new BufferedReader(folyam);
String sor = null;
do
{
sor = fileolvaso.readLine();
System.out.println(sor);
}while (sor != null);
fileolvaso.close();
}
}
=== A File és a Scanner osztály használata ===
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
class Program01
{
public static void main(String[] args) throws FileNotFoundException
{
File f = new File("adat.txt");
Scanner bef = new Scanner(f);
while(bef.hasNextLine())
{
System.out.println(Integer.parseInt(bef.nextLine()));
}
}
}
=== Fájl olvasása kivételkezelésével ===
A kivételek kezelését sokan a úgy oldják meg, hogy
a fájlkezelő utasításokat egy try..catch szerkezetbe ágyazzák.
Például így:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
class Program01 {
public static void main(String[] args) {
File f = new File("adat.txt");
try {
Scanner fin = new Scanner(f);
while(fin.hasNextLine()) {
System.out.println(Integer.parseInt(fin.nextLine()));
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
}
}
A kivétel elkapásának persze akkor van értelme, ha magunk akarunk
valamilyen szöveges üzenetet megjeleníteni. Ekkor a szöveges
üzenet a catch() { } blokkba kerül.
=== Fájlbeolvasás korrekt kivételkezeléssel ===
A fenti kivételkezeléses példában a fájlkezelő utasításokat
a try..catch szerkezetbe ágyaztuk. Ez nem valami elegáns,
ráadásul átláthatatlanná teszik a szépen megírt
fájlkezelő blokkunkat. A következő példában a kivételt
eldobjuk a fájlkezelő részben, és mellette létrehozunk
egy hasonló nevű függvényt, amelynek a feladata csak
a kivétel kezelése.
import java.io.FileNotFoundException;
import java.io.File;
import java.util.Scanner;
public class FileBeolvas {
public static void beolvas() {
try {
tryBeolvas();
}catch(FileNotFoundException ex) {
System.err.println("A fájl nem található");
}
}
public static void tryBeolvas() throws FileNotFoundException {
File f = new File("adat.txt");
Scanner olvaso = new Scanner(f);
while(olvaso.hasNextLine()) {
System.out.println(olvaso.nextLine());
}
}
public static void main(String[] args) {
beolvas();
}
}
Vegyük észre a fájlkezelő metódus, amelynek a neve beolvas() volt fentebb,
most át lett nevezve tryBeolvas()-ra. A hibakezelő metódus kapta a
beolvas() nevet. A hibakezelő metódusból hívjuk meg a tryBeolvas() metódust.
==== Fájlba írás ====
=== Egyszerű fájlba írás ===
import java.io.*;
class Program
{
public static void main(String args[]) throws IOException
{
FileWriter iro = new FileWriter("adat.txt", true);
iro.write("joska:titok:gazdasag:Szolnok\n");
iro.flush();
iro.close();
System.out.println("Kiírva");
}
}
A konstruktorban a második paraméter true, azt jelenti hozzáfűzünk az állományhoz.
Ez a paraméter nem kötelező. Ha nem adjuk meg alapértelmezetten felülírjuk az állományt.
=== BufferedWriter használata ===
import java.io.*;
class Program3
{
public static void main(String args[]) throws IOException
{
FileWriter firo = new FileWriter("adat2.txt", true);
BufferedWriter iro = new BufferedWriter(firo);
iro.write("Valai");
iro.close();
firo.close();
System.out.println("Kiírva");
}
}
=== PrintWriter használata ===
import java.io.*;
class Program4
{
public static void main(String args[]) throws IOException
{
FileWriter firo = new FileWriter("adat2.txt", true);
PrintWriter iro = new PrintWriter(firo);
iro.println("Valai");
firo.close();
System.out.println("Kiírva");
}
}
=== Összetettebb fájlba írás ===
import java.io.*;
public class ap
{
public static void main(String[] args) throws IOException
{
File f = new File("adat.txt");
FileWriter kifolyam = new FileWriter(f); // Ha hozzáfűzni akarunk akkor FileWriter(f, true);
PrintWriter kimenet = new PrintWriter(kifolyam);
kimenet.println("alma");
kimenet.println("körte");
kimenet.println("szilva");
kimenet.println("barack");
kimenet.close();
}
}
==== Fájl sorainak olvasása darabolással ====
import java.io.*;
import java.util.*;
public class ap
{
public static void main(String[] args) throws IOException
{
File f = new File("adat.txt");
FileReader bemenet_folyam = new FileReader(f);
BufferedReader bemenet = new BufferedReader(bemenet_folyam);
boolean vege = false;
String s, gyumolcs;
int sorszam, suly;
while(!vege)
{
s = bemenet.readLine();
if (s != null)
{
StringTokenizer Tokenek = new StringTokenizer(s);
sorszam = Integer.valueOf(Tokenek.nextToken()).intValue();
suly = Integer.valueOf(Tokenek.nextToken()).intValue();
gyumolcs = Tokenek.nextToken();
System.out.println(sorszam + " " + suly + " " + gyumolcs);
}
else
vege = true;
}
bemenet.close();
}
}
==== Fájl olvasása karakterenként ====
InputStream in = new FileInputStream("adat.txt");
Reader r = new InputStreamReader(in, "US-ASCII");
int intch;
while ((intch = r.read()) != -1)
{
char ch = (char) intch;
//...
}
==== Az util csomag használata ====
import java.io.*;
import java.util.*;
class Program {
private static String fajlOlvas(String path) {
File file = new File(path);
Scanner olvaso = null;
StringBuilder strb = new StringBuilder((int)file.length());
try {
olvaso = new Scanner(file);
} catch(IOException e) {
e.printStackTrace();
}
String sorTores = System.getProperty("line.separator");
try {
while(olvaso.hasNextLine())
strb.append(olvaso.nextLine() + sorTores);
return strb.toString();
} finally {
olvaso.close();
}
}
public static void main(String[] args) {
String str = fajlOlvas("adat.txt");
System.out.println(str.replace("m", "g"));
}
}
Egy rövid példa:
import java.util.Scanner;
import java.io.File;
import java.io.IOException;
class Program {
public static void main(String[] args) throws IOException {
File file = new File("adat.txt");
Scanner olvaso = new Scanner(file);
System.out.println(olvaso.nextLine());
System.out.println(olvaso.nextLine());
}
}
Vegyük észre, hogy itt nem olvasunk a fájl végéig.
A fájl végéig olvasáshoz:
while(olvaso.hasNextLine())
strb.append(olvaso.nextLine() + sorTores);
==== Olvasás byte tömbbe ====
import java.io.*;
import java.util.*;
class Program {
private static String readFileAsString(String filePath) throws IOException {
byte[] buffer = new byte[(int) new File(filePath).length()];
FileInputStream f = new FileInputStream(filePath);
f.read(buffer);
return new String(buffer);
}
public static void main(String[] args) throws IOException {
String str = readFileAsString("adat.txt");
System.out.println(str);
}
}
==== Karakterkódolás beállítása ====
Néhány megadható kódolás:
* UTF-8
* ISO-8859-1
* Windows-1252
* US-ASCII
További kódokat, a java.nio.charset.Charset osztály dokumentációja biztosít.
UTF-8 kódolással, Linuxon és Windowson is helyesen látszanak az ékezetek.
Scanner nFile = new Scanner(new File(fileName), "UTF-8");
vagy:
try {
String fileName = "adat.txt";
Reader r = null;
try {
InputStream in = new FileInputStream(fileName);
//US-ASCII
r = new InputStreamReader(in, "UTF-8");
} catch(UnsupportedEncodingException e) {}
Scanner nFile = new Scanner(r);
while(nFile.hasNextLine()) {
String str = nFile.nextLine();
System.out.println(str);
}
nFile.close();
} catch(FileNotFoundException e) {
System.err.println("Hiba a fájlból olvasás során");
}
Stream osztállyokkal:
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.BufferedReader;
class Program01 {
public static void main(String args[]) throws IOException {
OutputStreamWriter fout = new OutputStreamWriter(new FileOutputStream("adat.txt"), "UTF-8");
fout.write("almaáűé");
fout.flush();
fout.close();
System.out.println("Kiírva");
InputStreamReader fin = new InputStreamReader(new FileInputStream("adat.txt"), "UTF-8");
BufferedReader in = new BufferedReader(fin);
System.out.println(in.readLine());
}
}
Karakterkódolás a Scanner osztállyal:
import java.util.Scanner;
import java.io.FileNotFoundException;
import java.io.File;
class Program01 {
public static void main(String[] args) {
Scanner nFile = null;
try {
nFile = new Scanner(new File("adat.txt"), "UTF-8");
} catch(FileNotFoundException ex) {
System.err.println("Nemlétező fájl");
}
String str = nFile.nextLine();
System.out.println(str);
nFile.close();
}
}
A hibakeresés leválasztása, karakterkódolás beállítása fájlba írás közben:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Solution {
public void writeFile() {
try {
tryWriteFile();
}catch(IOException e) {
System.err.println("Hiba! A kiírás sikertelen!");
System.err.println(e.getMessage());
}
}
public void tryWriteFile() throws IOException {
try(
FileOutputStream fos = new FileOutputStream("data.txt", true);
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8")
) {
osw.write("aaaa");
osw.write(":bbbb");
osw.write("\n");
}
}
}
==== Típusos fájl ====
import java.io.BufferedOutputStream;
import java.io.BufferedInputStream;
import java.io.DataOutputStream;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
class Program01 {
public static void main(String[] argv) throws Exception {
FileOutputStream fileOut = new FileOutputStream("data.txt");
BufferedOutputStream bufferOut = new BufferedOutputStream(fileOut);
DataOutputStream dataOut = new DataOutputStream(bufferOut);
dataOut.writeUTF("árvíztűrő");
dataOut.writeLong(34L);
dataOut.writeInt(44);
dataOut.writeDouble(32.343);
dataOut.writeBoolean(true);
dataOut.close();
bufferOut.close();
fileOut.close();
FileInputStream fileIn = new FileInputStream("data.txt");
BufferedInputStream bufferIn = new BufferedInputStream(fileIn);
DataInputStream dataIn = new DataInputStream(bufferIn);
System.out.println(dataIn.readUTF());
System.out.println(dataIn.readLong());
System.out.println(dataIn.readInt());
System.out.println(dataIn.readDouble());
System.out.println(dataIn.readBoolean());
dataIn.close();
bufferIn.close();
fileIn.close();
}
}
A sorrendet tartani kell.
==== Véletlen hozzáférésű fájlok ====
=== Írás fájlba ===
import java.io.*;
class Program01 {
public static void main(String args[]) throws IOException{
System.out.println("Hi");
RandomAccessFile file = new RandomAccessFile("adat.txt", "rw");
file.seek(12);
file.write("Hello World".getBytes());
file.close();
}
}
A seek() metódussal a 12-es helyre állítom a fájlmutatót.
Ha üres a 12 pozíció előtt a fájl, akkor NUL értékekkel tölti fel.
=== UTF karakterek írása és olvasása ===
import java.io.*;
class Program01 {
public void kiir() throws IOException {
System.out.println("Kiírás");
RandomAccessFile file = new RandomAccessFile("adat.txt", "rw");
file.seek(20);
file.writeUTF("alma");
file.seek(40);
file.writeUTF("körte");
file.seek(60);
file.writeUTF("barack");
file.seek(80);
file.writeUTF("szilva");
file.close();
}
public void olvas() throws IOException {
RandomAccessFile file = new RandomAccessFile("adat.txt", "r");
file.seek(40);
System.out.println(file.readUTF());
file.seek(60);
System.out.println(file.readUTF());
file.close();
}
public static void main(String args[]) throws IOException{
new Program04().kiir();
new Program04().olvas();
}
}
==== Gyakorlat ====
* Sorolja fel, milyen osztályok használata jöhet szóba fájlkezelés esetén.
* Mondjon egy osztály, amellyel egy állomány végéhez fűzhetünk sorokat.
* Milyen osztályok használata esetén adhatjuk meg a karakterkódolást is fájlból olvasás során?
===== Típus ellenőrzés =====
==== Kivételek használata ====
Ellenőrizi szeretnénk, hogy valóban szabályosan valós szám lett beírva:
try {
double a = be.nextDouble();
} catch (Exception e) {
System.out.println("Nem valós szám!");
}
Ha nem így történt, hibaüzenetet küldünk.
Ügyeljünk arra, hogy a forrásban ugyan tizedes pontot használunk, de a bekérésnél tizedes vesszőt vár a java.
Ugyanez egész számmal:
try {
int a = be.nextInt();
} catch (Exception e) {
System.out.println("Nem egész szám!");
}
Teljes példa a Scanner osztály használatára:
import java.io.*;
import java.util.*;
class Tip {
public static void main(String args[]) throws IOException {
System.out.println("Típusellenőrzés");
Scanner be = new Scanner(System.in);
System.out.print("Szám: ");
try {
int a = be.nextInt();
} catch (Exception e) {
System.out.println("Nem egész szám");
}
System.in.read();
}
}
Teljes példa BufferedReader osztály használata esetén
import java.io.*;
class Tip {
public static void main(String args[]) throws IOException {
System.out.println("Típusellenőrzés");
InputStreamReader befolyam = new InputStreamReader(System.in);
BufferedReader be = new BufferedReader(befolyam);
String s;
int szam;
System.out.print("Szám: ");
s = be.readLine();
try {
szam = Integer.valueOf(s).intValue();
} catch(Exception e) {
System.out.println("Gond van konverzióval");
}
System.in.read();
}
}
Konverziónál, használhatjuk a NumberFormatException kivételt is:
try {
szam = Integer.valueOf(s).intValue();
} catch(NumberFormatException e) {
System.out.println("Gond van konverzióval");
}
==== Függvény megírásával ====
import java.io.*;
class Tipusv {
public static void main(String args[]) throws IOException {
System.out.println("Hi");
InputStreamReader befolyam = new InputStreamReader(System.in);
BufferedReader be = new BufferedReader(befolyam);
String s = be.readLine();
if (isInteger(s))
System.out.println("Egész szám");
else
System.out.println("Nem egész szám");
System.in.read();
}
static public boolean isInteger(String bemenet) {
try {
Integer.parseInt(bemenet);
return true;
} catch(Exception e) {
return false;
}
} /* isInteger */
}
==== Reguláris kifejezések használata ====
import java.io.*;
class Tipusv {
public static void main(String args[]) throws IOException {
System.out.println("Hi");
InputStreamReader befolyam = new InputStreamReader(System.in);
BufferedReader be = new BufferedReader(befolyam);
String s = be.readLine();
if(s.matches("((-|\\+)?[0-9]+(\\.[0-9]+)?)+"))
System.out.println("Szám");
else
System.out.println("Ez nem szám");
System.in.read();
}
}
Ez a kódrész elfogad előjeleket és tizedespontot is.
==== text csomag ====
import java.io.*;
import java.text.*;
class Tipusv {
public static void main(String args[]) throws IOException {
System.out.println("Hi");
InputStreamReader befolyam = new InputStreamReader(System.in);
BufferedReader be = new BufferedReader(befolyam);
String s = be.readLine();
DecimalFormat df = new DecimalFormat("#%");
Number a = 0;
try {
a = df.parse(s);
System.out.println("Szám: " + a.doubleValue());
} catch(Exception e) {
System.out.println("Nem megfelelő formátum" );
}
System.in.read();
}
}
Példaformátum leírás:
"#,##0.00%"
"#,##0.00"
A Number típusú objektum metódusai.
| byte | byteValue() | Az adott szám bájt értékével tér vissza |
| abstract double | doubleValue() | Az adott számot doulbe-ként adja vissza |
| abstract float | floatValue() | Az adott számot float-ként adja vissza |
| abstract int | intValue() | Az adott számot int-ként adja vissza |
| abstract long | longValue() | Az adott számot long-ként adja vissza |
| short | shortValue() | Az adott számot short-ként adja vissza |
import java.io.*;
import java.text.*;
class Tipusv {
public static void main(String args[]) throws IOException {
System.out.println("Hi");
InputStreamReader befolyam = new InputStreamReader(System.in);
BufferedReader be = new BufferedReader(befolyam);
String s = be.readLine();
NumberFormat df = NumberFormat.getInstance();
Number a = 0;
try {
a = df.parse(s);
System.out.println("Szám: " + a.doubleValue());
} catch(Exception e) {
System.out.println("Nem megfelelő formátum" );
}
System.in.read();
}
}
===== Metódusok létrehozása =====
==== Statikus metódusok ====
Ha már nagyon sok utasításunk van, azokat csoportosítani szoktuk,
adunk neki egy nevet, majd a nevével hivatkozva hívjuk meg
az összes utasítást. Például szeretnénk egy névjegykártyát
kiíratni, amelyen szerepel a nevünk, címünk, telefonszámunk,
e-mail címünk, weblapunk.
class Program {
static void nevjegy() {
System.out.println("Nagy József");
System.out.println("Budapest");
System.out.println("Tél u. 3.");
System.out.println("+36 (30) 123-4567");
System.out.println("nagy@valaholdomain.hu");
System.out.println("http://valaholdomain.hu");
}
public static void main(String[] args) {
nevjegy();
}
}
A fenti példában a metódus fej része így néz ki:
static void nevjegy()
* ( )
* A név után tettünk egy nyitó és egy bezáró zárójelet.
* static
* A static egy módosító, amely megmondja, hogy a metódust akkor is használhatjuk, ha nem hoztunk létre az osztályból példányt.
* void
* A void a visszatérés típusát mondja meg. A void azt jelenti nem térünk vissza semmivel.
* { }
* Az utasításokat a kapcsos zárójelekkel fogom össze egyetlen blokká.
Néha a metódusainknak szeretnénk bemenő paramétereket megadni.
Például, szeretnénk egy szám négyzetét venni. Ekkor a metódusnak
paraméterkén megadhatjuk mi legyen ez a szám.
class Program {
static void negyzet(double szam) {
System.out.println(szam * szam);
}
public static void main(String[] args) {
negyzet(3.5);
}
}
Előfordulhat, hogy a kapott számot nem képernyőre szeretném
íratni, hanem szeretném azt megkapni, továbbszámolás céljára.
Ekkor a metódust úgy kell megírni, hogy adja vissza a
kért értéket. Maradva a fenti négyzetszámító programnál,
alakítsuk úgy át a programot, hogy adja vissza az
adott szám értékét.
class Program {
static double negyzet(double szam) {
return szam * szam;
}
public static void main(String[] args) {
System.out.println(negyzet(3.5)+2);
}
}
Vegyük észre, hogy a metódusainkat az osztályon belül hoztuk létre,
static kulcsszóval láttuk el, ennek hatására az osztály példányosítása nélkül
tudjuk azokat használni.
A metódusoknak egész sorozatát hozhatjuk létre:
class Program {
static double dupla(double szam) {
return 2 * szam;
}
static double negyzet(double szam) {
return szam * szam;
}
static double felez(double szam) {
return szam / 2;
}
public static void main(String[] args) {
System.out.println(Program.negyzet(3.0));
System.out.println(Program.dupla(3.0));
System.out.println(Program.felez(3.0));
}
}
==== Példánymetódus ====
Az alábbi példában a metódust a static kulcsszó
nélkül hozzuk létre. A használata ebben az esetben csak példányosítással lehetséges.
class Program {
double negyzet(double szam) {
return szam * szam;
}
public static void main(String[] args) {
Program program = new Program();
System.out.println(program.negyzet(3.5)+2);
}
}
Metódusok egész sorozata:
class Program {
double dupla(double szam) {
return 2 * szam;
}
double negyzet(double szam) {
return szam * szam;
}
double felez(double szam) {
return szam / 2;
}
public static void main(String[] args) {
Program program = new Program();
System.out.println(program.negyzet(3.0));
System.out.println(program.dupla(3.0));
System.out.println(program.felez(3.0));
}
}
==== Metódusok külön osztályban ====
class Szamitas {
double dupla(double szam) {
return 2 * szam;
}
double negyzet(double szam) {
return szam * szam;
}
double felez(double szam) {
return szam / 2;
}
}
class Program {
public static void main(String[] args) {
Szamitas szamitas = new Szamitas();
System.out.println(szamitas.negyzet(3.0));
System.out.println(szamitas.dupla(3.0));
System.out.println(szamitas.felez(3.0));
}
}
==== Paraméterátadás ====
Ha készítek egy metódust, a bemenő paramétereket **formális paraméternek** is nevezzük.
Ezzel szemben az **aktuális paraméter**, a metódus hívásának helyén behelyettesített
változók.
A Java nyelvben a paraméterek **érték szerint** kerülnek átadásra. Másként szólva, ha
egy metóduson belül megváltoztatom egy formális paraméter értéket, ez nem érinti az
aktuális paraméter értékét.
Ha nem alaptípusokat használunk paraméterként az átadás már nem érték szerint történik.
A következő példában egyszerű típust adunk át paraméterként:
class Program01 {
public static void szamol(Integer szam) {
szam = szam * 2;
System.out.println(szam);
}
public static void main(String[] args) {
Integer szam = 4;
szamol(szam);
System.out.println(szam);
}
}
Eredmény:
8
4
A következő példában referencia típus adunk át:
class Dolog {
int szam = 1;
}
class Program01 {
public static void szamol(Dolog dolog) {
dolog.szam = dolog.szam * 2;
System.out.println(dolog.szam);
}
public static void main(String[] args) {
Dolog dolog = new Dolog();
dolog.szam = 4;
szamol(dolog);
System.out.println(dolog.szam);
}
}
Eredmény:
8
8
Az utóbbival egyező eredményt kapunk tömbökkel, mivel azok is referenciák:
class Program01 {
public static void szamol(int[] t) {
t[0] = t[0] * 2;
System.out.println(t[0]);
}
public static void main(String[] args) {
int[] t = new int[2];
t[0] = 4;
t[1] = 10;
szamol(t);
System.out.println(t[0]);
}
}
Eredmény:
8
8
===== Több fájl =====
Ha már sok osztályunk van érdemes azokat külön állományban tárolnunk.
A következő két fájl egyszerűen egy könyvtárban használom.
class Program01 {
public static void main(String args[]) {
Program02 prog = new Program02();
prog.kiir();
}
}
class Program02 {
public void kiir() {
System.out.println("Másik osztály");
}
}
===== Saját osztályaink "becsomagolása" =====
Ha még több saját osztályunk van azokat külön állományokba rakjuk és becsomagoljuk.
Abban a fájlban ahol az osztályaink el vannak helyezve, az állomány
elején egy package Csomagnév; utasítást kell elhelyeznünk.
Egy osztály importálása egy csomagból az import utasítás után
megadott csomagnév.Osztály; formában történhet. Ilyen formában:
import csomagnév.Osztály;
Ha "*" karaktert használunk, akkor a csomag összes osztályát
használatba vettük.
Minden csomag számára saját könyvtárat kell létrehozni.
A csomag osztályainak .class állományait ide be kell
másolni.
import sajat.*;
class Program01 {
public static void main(String args[]) {
Program02 ketto = new Program02();
ketto.kikuld();
Program03 harom = new Program03();
harom.kikuld();
}
}
package sajat;
public class Program02 {
public void kikuld() {
System.out.println("Második");
}
}
package sajat;
public class Program03 {
public void kikuld() {
System.out.println("Harmadik");
}
}