Masyvai yra indeksais sužymėtų vieno tipo duomenų (objektų) eilė. Masyvai nebūtinai
yra masyvūs. Masyvą gali sudaryti vos keli objektai (pavyzdžiui, skaičiai). Jie numeruojami
sveikaisiais neneigiamais skaičiais. Pirmojo elemento numeris visada yra 0.
Norėdami naudoti masyvą pirmiausia turime parinkti jam vardą.
Pavyzdžiui,
int skaiciai_a [];
int [] skaiciai_b;
float [] skaiciai_c;
String vardai[];
tokiomis eilutėmis nurodome, kad skaiciai_a, skaiciai_b yra sveikųjų skaičių masyvų
vardai, skaičiai_c - slankaus kablelio tipo skaičių, o vardai - tekstinių (String tipo)
duomenų masyvo vardai. Pastebėkime, kad laužtinius skliaustus galime rašyti tiek prieš masyvo
vardą, tiek po jo.
Šios eilutės dar nesukuria masyvų, netgi nenurodo, kiek elementų jie turės.
Jos tik nurodo būsimus jų vardus.
Norėdami, pavyzdžiui, kad būtų išskirta atmintis sveikųjų skaičių masyvui, sudarytam
iš 5 elementų, galime nurodyti:
skaiciai_a = new int[5];
Dabar jau galima priskirti masyvo elementams reikšmes. Padarykime tai panaudoję ciklo
operatorių:
for (int i=0; i<5; i++) skaiciai_a[i]=i*i;
Šio masyvo elementai yra pirmųjų skaičių kvadratai.
Taigi programos eilutės, susijusios su masyvo sukūrimu yra tokios:
int skaiciai_a [];
skaiciai_a = new int[5];
for (int i=0; i<5; i++) skaiciai_a[i]=i*i;
Atlikti šį darbą galime nurodyti ir kitaip.
Pavyzdžiui, taip
int [] skaiciai_b = {7,5,12};
String [] vardai = {"Algis", "Agnė","Rūta", "Simas"};
iš karto nurodome ir masyvų vardus ir masyvų elementų skaičių ir pačius elementus.
Jeigu reikia reikia sužinoti, kiek elementų turi masyvas, kurio vardas, pavyzdžiui, mas, tai šį skaičių galime gauti
taip:
mas.length
Į pradžią
Pertvarkysime programą į įskiepį. Skaičiavimai prasidės tuomet, kai
nuspausime mygtuką. Skaičiavimo rezultatus išvesime į išvedimo
lauką.
Java programą gali sudaryti daug klasių ir metodų. Programos (ne įskiepio!) vykdymas prasideda
nuo main metodo. Taigi šio metodo pagrindinė paskirtis - duoti signalą pradėti darbą,
kitaip tariant pažadinti pagrindinės klasės konstruktorių (pagrindinė klasė ir java programos failas turi
vadintis tuo pačiu vardu). Tačiau savo pavyzdžiuose mes pagrindinį metodą pernelyg apkrovėme ir kitais
darbais. Todėl dar kartą perrašykime programą, palikdami pagrindiniam metodui tik
pagrindinį darbą.
Daugiamačiai masyvai
Programuojant Java kalba galima naudoti dvimačius masyvus arba lenteles.
Dvimačių masyvų vardus programoje nurodome taip:
int [] [] skaic_1;
float skaic_2 [] [];
Masyvui saugoti reikalingos atminties dydis nurodomas, pavyzdžiui, taip:
skaic_1= new int [2] [3];
Tokį masyvą galime įsivaizduoti kaip iš dviejų eilučių ir trijų stulpelių
sudarytą lentelę. Kaip ir vienmačių masyvų atveju dvimatį masyvą galima aprašyti ir
priskirti jo elementams reikšmes iškar:
float [] [] skaic_2 = {{1.2,3.2,4.1}
{5.4,-1.2,3.0}}
Šitaip apibrėžėme dvi eilutes ir tris stulpelius turinčią lentelę, t.y.
dvimatį masyvą.
Galima naudoti lenteles (dvimačius masyvus), turinčias ne tą patį elementų skaičių
skirtingose eilutėse. Apibrėžkime tris eilutes turintį dvimatį masyvą su skirtingais
elementų skaičiais kiekvienoje eilutėje.
int [] [] skaic_3 = new [3] [];
skaic_[0] = new int [2];
skaic_[1] = new int [3];
skaic_[3] = new int [4];
Dvimačio masyvo skaic_3 elementų skaičių i-ojoje eilutėje gausime kreipdamiesi
taip: skaic_3[i].length;
Dvimačius masyvus su skirtingo ilgio eilutėmis apibrėžti ir elementams reikšmes
priskirti galime ir iškart. Pavyzdžiui,
float [] [] skaic_2 = {{1.2,3.2,4.1,5}
{5.4,-1.2,3.0} }
Šitaip apibrėžėme keturis elementus pirmoje eilutėje ir tris antroje turintį masyvą.
Į pradžią
Masyvai iš objektų
Masyvus galima sudaryti ne tik iš skaičių ar tekstinių duomenų, bet ir iš kitokių
objektų, kuriais naudojamės programuodami Java kalba arba ir patys susikuriame.
Pavyzdžiui, sudarysime masyvą iš mygtukų ir antraščių, o juos išdėstysime įskiepio lange.
import java.awt.*;
import java.applet.*;
public class Objekt_masyv extends Applet {
public void init() {
Button [] mygt = new Button[6];
String [] antr = {"A","B","C","D","E","F"};
setLayout(new GridLayout(3,2));
for (int i=0; i<6; i++)
{mygt [i] = new Button(antr[i]);
add(mygt[i]);
}}}
Pažiūrėkite, kaip veikia.
4 pavyzdys. Anketų masyvas
Sudarysime masyvą iš savo sukurtų objektų - anketų. Masyvo elementų skaičių
ir pačius anketų duomenis įvesime iš klaviatūros.
Patvirtindama, kad viską suprato, programa išves pirmosios įvestos anketos duomenis.
import java.io.*;
class Anketa{ // Anketos aprašymas
String vardas,pavarde;
short amzius;
Anketa(String v,String p,short a){
vardas=v;
pavarde=p;
amzius=a;}}
public class Anketos{
public static void main ( String arg[] ) throws IOException {
String xString;
int n;
Anketa a1=new Anketa(null,null,(short)0);//sukuriama anketa
BufferedReader br = new BufferedReader (
new InputStreamReader (System.in));
System.out.print ("Iveskite anketu skaiciu: ");
xString = br.readLine();
try{n=Integer.parseInt(xString);}
catch (NumberFormatException e ) {
System.out.println (xString+" nera skaicius");return;}
if (n<=0) return;
Anketa[] anketos = new Anketa[n]; //sukuriamas anketu masyvas
for (int i=0;i<n;i++) {
System.out.print ("("+i+") Vardas: ");
a1.vardas = br.readLine();
if(a1.vardas.equalsIgnoreCase("Q")) break;
System.out.print ("("+i+") Pavarde: ");
a1.pavarde = br.readLine();
if(a1.pavarde.equalsIgnoreCase("Q")) break;
System.out.print ("("+i+") Amzius: ");
xString = br.readLine();
if(xString.equalsIgnoreCase("Q")) break;
try{a1.amzius = (short)Integer.parseInt(xString);}
catch (NumberFormatException e ) {
System.out.println (xString+" nera skaicius");continue;}
anketos[i]=new Anketa(a1.vardas,a1.pavarde,a1.amzius);
}
if (anketos[0]!=null)
System.out.println (anketos[0].vardas+" "+anketos[0].pavarde+
" yra "+anketos[0].amzius+" m.");
}
}
Vector klasė
Masyvai, kuriuos nagrinėjome, yra tik paprasčiausias metodas duomenų struktūroms kurti. Java turi daug kitokių priemonių.
Panagrinėkime, kaip Java sistemoje galime kurti dinaminius masyvus, t.y. tokias duomenų struktūras, kuriose įrašų kiekis
keičiasi vykstant darbui.
Viena tokių priemonių yra Vector klasė. Ją reikia įkelti iš java.util paketo, taigi kodo pradžioje turi būti
eilutė
import java.util.*; arba import java.util.Vector;
Į vektorių galima talpinti bet kokius objektus, jie identifikuojami pagal eilės numerį (pradedant nuo nulio);
Tuščią vektorių galime sukurti tiesiog taip:
Vector vektoriaus_vardas = new Vector();
Dabar jau galime dirbti, naudodami Vector klasės metodus. Išvardysiu tik keletą, kurie pravers atliekant užduotį.
Metodo tipas, vardas | Metodo darbas |
void addElement(Object ob) | Prideda naują elementą |
size() | Pasako, kiek yra įrašų |
Object elementAt(int nr) | Perduoda objektą, kuris įrašytas į vektorių su numeriu nr |
void setElementAt( Object , int nr) | Pakeičia elementą su numeriu nr nurodytu elementu |
void insertElementAt( Object , int nr ) | Įterpia elementą į nurodytą vietą |
void removeAllElements() | Pašalina visus elementus |
void removeElementAt( int nr) | Pašalina elementą su numeriu nr |
Panagrinėkime pavyzdį. Parašysime programą, kuri kurs dinaminį masyvą (vektorių) iš įrašų, kuriuos sudarys trys elementai
data (String tipo duomuo), dienos pajamos ir išlaidos (double tipo skaičiai).
Mūsų įrašai, bus tokios klasės objektai:
class Irasas {
String data;
double pajamos, islaidos;
Irasas (String st, double paj, double isl)
{
data=st;
pajamos=paj;
islaidos=isl;
}
Dirbant su programa įrašai bus pridedami, šalinami, taip pat norėsime sužinoti, kiek tų įrašų jau yra, atskirai skaičiuosime pajamas ir išlaidas. Tokiam darbui teks sukurti keletą metodų. Bendra programos struktūra gali būti tokia:
import java.io.*;
import java.util.*;
public class Pajamos_islaidos {
BufferedReader skaitymas = new BufferedReader (
new InputStreamReader (System.in));
int op_nr;
Vector sarasas = new Vector ();
public static void main (String [] args )
{ new Pajamos_islaidos();}
Pajamos_islaidos ()
{
meniu(); // Nubraižys ekrane lentelę
dirbti(); // Valdys darbą, priklausomai nuo operacijos nr.
}
public void meniu()
{
System.out.println("__________________________________\n ");
System.out.println("Iveskite operacijos numeri\n ");
System.out.println("1 - naujas irasas\n ");
System.out.println("2 - suzinokite, kiek irasu\n ");
System.out.println("3 - panaikinkite i-aji irasa\n ");
System.out.println("4 - viso pajamu\n ");
System.out.println("5 - viso islaidu\n ");
System.out.println("6 - baigti darba\n ");
System.out.println("__________________________________\n ");
}
public void dirbti () { }
public void naujas () {} // Naujam įrašui pridėti
public void kiek () {} // Pasakys, kiek jau yra įrašų
public void naikinti () {} // Naikins įrašus
public void pajamu () {} // Skaičiuos pajamas
public void islaidu () {} // Skaičiuos išlaidas
class Irasas {
String data;
double pajamos, islaidos;
Irasas (String st, double paj, double isl)
{
data=st;
pajamos=paj;
islaidos=isl;
}
}
Belieka parašyti metodus. Darbo valdymo metodas gali būti, pavyzdžiui, toks:
public void dirbti () {
while (!(op_nr== 6))
{ try { op_nr=Integer.parseInt(skaitymas.readLine());} // Skaitome operacijos numerį
catch (IOException isimtis) {}
switch (op_nr) { // Priklausomai nuo operacijos numerio iškviečiame metodą.
case 1:
naujas();
break;
case 2:
kiek();
break;
case 3:
naikinti();
break;
case 4:
pajamu();
break;
case 5:
islaidu();
break;
default:
break;
}}
}
Naujo įrašo sukūrimo metodas
public void naujas () {
String dt;
double pj, isl;
try {
System.out.println("Iveskite data\n");
dt= skaitymas.readLine();
System.out.println("Iveskite pajamas\n");
pj=Double.valueOf(skaitymas.readLine()).doubleValue();
System.out.println("Iveskite islaidas\n");
isl=Double.valueOf(skaitymas.readLine()).doubleValue();
sarasas.addElement(new Irasas(dt,pj,isl));
System.out.println("Irasas sukurtas\n");
}
catch (IOException is) {
System.out.println("Iraso ivesti nepavyko\n");
} }