Számítástechnika szigorlat 15-ös tétel:
-
Tömbök, String osztály, Vector osztály a Javaban
Tömbök
A tömb referencia típusú változó, melyet deklarálnunk kell. Az elemtípus lehet akár primitív, akár referencia (osztály típusú vagy tömb típusú).
Deklarálás:
elemtípus [] tömbazonosító;
vagy
elemtípus tömbazonosító [];
pl: int [] a;
int b[];
Az így deklarált változó képes egy, a megadott elemtípusú tömbre mutatni. Még csak a referenciának (memóriacímnek) foglaltunk helyet, a tömböt külön létre kell hoznunk.
Létrehozás (futás közben):
new elemtípus [méret]
pl: a = new int[10];
b = new int[20];
Természetesen történhet rögtön a deklaráláskor is a létrehozás:
String[] sArray = new String[50];
Minden tömbnek van egy length konstansa.
Indexelés: 0 .. length-1
int[] iArray=new int[10];
for(int i=0; i
iArray[i]=Console.readInt("Az "+(i+1)+". szam: ");
System.out.println("A tomb elemei visszafele: ");
for(int i=iArray.length-1; i>=0; i--)
System.out.print(iArray[i]+" ");
Inicializáló blokk: deklaráláskor a tömb elemeinek kezdeti értékek adhatók, pl:
int[] iArray={2, 4, 6, 8, 10};
char[] szamjegyek={'0','1','2','3','4','5','6','7','8','9'}
Ekkor nem kell a tömböt a new operátorral létrehozni, a {} blokk képző operátor megteszi ezt helyettünk. A tömb mérete pontosan akkora lesz, amennyi a felsorolt értékek száma.
A t2 tömb értékadás szerint kompatibilis a t1 tömbbel (azaz t1=t2 megengedett), ha
-
primitív elemtípus esetén t1 és t2 elemtípusa azonos;
-
referencia elemtípus esetén t2 elemtípusa t1 elemtípusával azonos, vagy annak leszármazottja.
Értékadáskor a tömb referenciája kap értéket, nem pedig az elemei (a tömb nem másolódik, hanem átíródik a mutatója), így különböző hosszúságú tömbök és értékül adhatók egymásnak.
Kétdimenziós tömb:
Deklarálás:
elemtípus [][] tömbazonosító;
Teljes kétdimenziós tömb létrehozása:
new elemtípus [méret0] [méret1]
Pl: int[][] matrix = new int[3][4];
Lépésenkénti (soronkénti) létrehozás. A sorok különböző méretűek lehetnek:
Pl: double[][] atlagok = new double[4][];
atlagok[0] = new double[20];
atlagok[1] = new double[18];
atlagok[2] = new double[25];
atlagok[3] = new double[22];
Analóg a helyzet a többdimenziós tömbök esetén.
Tömb paraméter.
Formális paraméterként egy tömbreferenciát kell deklarálnunk, amely fogadja az aktuális tömb referenciáját. Az aktuális tömbnek értékadás szerint kompatíbilisnek kell lennie a formális tömbbel.
Példa: Írjunk osztályt, amelynek adata egy int tömb. Az objektum létrehozásakor a konstruktor paraméterében adhassuk meg a tömb hosszát. Tartalmazzon egy bekér, kiir és egy osszeg nevű metódust!
import extra.*;
class Tomb{
private int[]t;
public Tomb(int hossz){
t=new int[hossz];
}
public void beker(){
for(int i=0;i
t[i]=Console.readInt(i+1+". szam: ");
}
public void kiir(){
for(int i=0;i
System.out.print(t[i]+" ");
System.out.println();
}
public int osszeg(){
int s=0;
for(int i=0;i
s+=t[i];
return s;
}
}//Tomb
public class Tombok{
public static void main(String[] args){
Tomb t1=new Tomb(5);
Tomb t2=new Tomb(7);
System.out.println("Adja meg az elso tomb elemeit (5):");
t1.beker();
System.out.println("Adja meg a masodik tomb elemeit (7):");
t2.beker();
System.out.println("Az elso tomb:");
t1.kiir();
System.out.println("Az elemek osszege: "+ t1.osszeg());
System.out.println("A masodik tomb:");
t2.kiir();
}
}
Konténerek
A konténer olyan objektum, amely objektumokat tárol, és alkalmas különböző karbantartási, keresési és bejárási funkciók megvalósítására. A java.util csomagban helyet foglaló kollekció keretrendszer egy általános konténereket tartalmazó osztálygyűjtemény. Általánosan jellemző rájuk: ha bármilyen objektumot beteszünk egy konténerbe, az „elveszti az osztálytudatát”.
Vector osztály
„Változtatható méretű tömb”, amely rendelkezik a fenti funkciókkal.
Mérete az elemek hozzáadásával automatikusan bővül.
Elemei indexelhetőek.
Elemei rendezetlenek (a Collections osztállyal lehet rendezni).
Néhány metódusa:
void
|
add(int index, Object element)
Inserts the specified element at the specified position in this Vector.
|
boolean
|
add(Object o)
Appends the specified element to the end of this Vector.
|
void
|
clear()
Removes all of the elements from this Vector.
|
boolean
|
contains(Object elem)
Tests if the specified object is a component in this vector.
|
Object
|
get(int index)
Returns the element at the specified position in this Vector.
|
int
|
indexOf(Object elem)
Searches for the first occurence of the given argument, testing for equality using the equals method.
|
int
|
indexOf(Object elem, int index)
Searches for the first occurence of the given argument, beginning the search at index, and testing for equality using the equals method.
|
boolean
|
isEmpty()
Tests if this vector has no components.
|
Object
|
remove(int index)
Removes the element at the specified position in this Vector.
|
boolean
|
remove(Object o)
Removes the first occurrence of the specified element in this Vector If the Vector does not contain the element, it is unchanged.
|
Object
|
set(int index, Object element)
Replaces the element at the specified position in this Vector with the specified element.
|
int
|
size()
Returns the number of components in this vector.
|
String
|
toString()
Returns a string representation of this Vector, containing the String representation of each element.
|
Példa:
import extra.*;
import java.util.*;
class Ember {
private String nev;
private int magassag;
public Ember(String nev, int magassag) {
this.nev = nev;
this.magassag = magassag;
}
public Ember(String nev) {
this(nev,0);
}
public String getNev() {
return nev;
}
public int getMagassag() {
return magassag;
}
public void setMagassag(int mag) {
if (mag>0)
magassag = mag;
}
public boolean equals(Object obj) {
return nev.equals(((Ember)obj).getNev());
}
public String toString() {
return Format.left(nev,10) + Format.right(magassag,3);
}
}//Ember osztály vége
public class TorpeProgram {
private Vector torpek = new Vector();
// A torpék bevitele:
void bevitel() {
Ember torpe;
String nev = Console.readLine("\nTorpe neve: ");
while (!nev.equals("")) {
if (torpek.contains(torpe = new Ember(nev)))
System.out.println("Van mar ilyen torpe!");
else {
torpe.setMagassag(Console.readInt("magassaga : "));
torpek.add(torpe);
}
nev = Console.readLine("Torpe neve: ");
}
}
// Egyszerű lista, beépített módon:
void lista1() {
System.out.println("\nBeepitett lista:");
System.out.println(torpek);
}
// torpek listázása index szerint, toString()-gel:
void lista2() {
System.out.println("\nLista index szerint:");
for (int i=0; i
System.out.println(torpek.get(i));
}
}
// Listázás toString() nélkül:
void lista3() {
Ember e;
System.out.println("\nEgyeni lista:");
for (int i=0; i
e = (Ember)(torpek.get(i));
System.out.println("Nev: "+e.getNev()+
" Magassag: "+e.getMagassag());
}
}
// Egy törpe megkeresése:
void kereses() {
System.out.println("\nKereses:");
Ember keresettEmber = new Ember(
Console.readLine("Torpe neve: "));
int poz = torpek.indexOf(keresettEmber);
if (poz >= 0)
System.out.println("Van, magassaga:"+
((Ember)(torpek.get(poz))).getMagassag());
else
System.out.println("Nincs ilyen");
}
public static void main(String[] args) {
TorpeProgram tp = new TorpeProgram();
tp.bevitel();
tp.lista1();
tp.lista2();
tp.lista3();
tp.kereses();
}
}
Megjegyzések:
1. A Vector osztály számos metódusa (pl. keresés a vektorban: indexOf) használja a benne lévő objektumok equals (egyenlő-e) metódusát az objektumok összehasonlítására. Ha a törpék vektorban név alapján akarok megkeresni egy törpét, akkor olyan equals metódust kell készítenem, mely a nevek azonosságát figyeli (van alapértelmezett equals metódus is, mely akkor ad igaz értéket, ha a két metódus azonos):
public boolean equals(Object obj) {
return nev.equals(((Ember)obj).getNev());
}
A paraméter (obj) általános Object típusú, ezt Ember típusúvá kell konvertálnunk: (Ember)obj . (Kér sztring összehasonlítása a String osztály equals metódusával történik.)
A vektorban való kereséshez egy keresőobjektumot hozunk létre, mely csak a nevet tartalmazza (egyébként is csak azt ismerjük).
Ember keresettEmber = new Ember(Console.readLine("Torpe neve: "));
int poz = torpek.indexOf(keresettEmber);
2. A vektorba betett, majd onnan kivett objektum elveszti az osztályát. Ha dolgozni szeretnénk vele, akkor vissza kell konvertálnunk a típusára (osztályára)
e = (Ember)(torpek.get(i));//e már Ember típusú
System.out.println("Nev: "+e.getNev() +" Magassag: "+e.getMagassag());
vagy tömörebben:
((Ember)(torpek.get(poz))).getMagassag());
|