4 tema. Masyvai

Turinys
 Sukurti masyvą
 1 pavyzdys. Masyvo elementų išvedimas
 Masyvo išvedimo metodas
 Daugiamačiai masyvai
 Dvimačio masyvo sudarymas ir išvedimas
  Masyvai iš objektų
  Anketų masyvas
 Vector klasė
 Hashtable klasė
 Užduotys

Sukurti masyvą

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ą   

1 pavyzdys. Masyvo elementų išvedimas

Parašykime programą, kuri apskaičiuotų masyvo elementus ir išvestų į ekraną jų reikšmes.
Ši programa skaičiuoja sveikųjų skaičių kvadratus ir rezultatus vaizduoja ekrane. Klasėje yra tik vienas (pagrindinis (main)) metodas, kuris ir atlieka visą darbą.
	  
public class Kvadratai {
public static void main (String [] args )
{int [] kvadr;
kvadr = new int[10];
for (int i=0; i<10; i++)
{
kvadr[i]=i*i;
System.out.println(kvadr[i]);
System.out.println();
}}}
    Atsisiųskite programos tekstą.
Pertvarkysime programą į įskiepį. Skaičiavimai prasidės tuomet, kai nuspausime mygtuką. Skaičiavimo rezultatus išvesime į išvedimo lauką.
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
public class Kvadrat extends Applet implements ActionListener{
int [] kvadr;          //Masyvo vardas 
TextArea txt;          //Išvedimo lauko vardas 
Button mygt;           //Mygtuko vardas 
public void init(){    //Pagrindinis apleto metodas 
setLayout(new BorderLayout());//Komponenčių išdėstymo planas: pagal lango siena
txt = new TextArea();    //Sukuriame išvedimo lauką
add("Center",txt);       //Išvedimo lauką talpiname lango centre
mygt = new Button("Skaičiuoti"); //Sukuriame mygtuką
mygt.addActionListener(this); // Prie mygtuko ,,prijungiame pasiklausymo įrenginį"
add("South",mygt); // Mygtuką talpiname lango apačioje
kvadr = new int[10]; // Masyvui išskiriama atmintis 
}

public void actionPerformed(ActionEvent e) //Nurodome, ką daryti, 
{for (int i=0; i<10; i++)               // kai gautas signalas apie įvykį 
{
kvadr[i]=i*i;
txt.append(kvadr[i]+"\n");
}}}
Pažiūrėkite, kaip veikia.    Atsisiųskite programos tekstą.

   Į pradžią   

2 pavyzdys. Masyvo išvedimo metodas


Pirmajame pavyzdyje masyvo elementų reikšmės buvo skaičiuojamos ir išvedamos tame pat pagrindiniame (main) programos metode. Dabar šį darbą padalysime: reikšmes skaičiuosime pagrindiniame metode, o išvedimui sudarysime atskirą metodą, kuriuo bus galima naudotis ne vieną kartą. Masyvo, kurio vardas yra, pavyzdžiui, Skaic elementų kiekį galima sužinoti kreipiantis į masyvą taip: Skaic.length
public class Kvadratai2 {
public static void main (String [] args )
{ 
int [] kvadr;
kvadr = new int[10];
for (int i=0; i<10; i++) kvadr[i]=i*i;
isvedimas(kvadr);
}
public static void isvedimas(int [] masyv)
{for (int i=0; i< masyv.length; i++)
System.out.println(masyv[i]);
}}
Atsisiųskite programos tekstą.

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ą.
public class Kvadratai3 {
public static void main (String [] args ) //Pagrindinis metodas 
{ new Kvadratai3();} liepia konstruktoriui sukurti klasę 

Kvadratai3 () { // O čia pasakyta, ką reikia daryti 
int [] kvadr;
kvadr = new int[10];
for (int i=0; i<10; i++) kvadr[i]=i*i;
isvedimas(kvadr); // kreipimasis į masyvo išvedimo metodą 
}
public  void isvedimas(int [] masyv)
{for (int i=0; i< masyv.length; i++)
System.out.println(masyv[i]);
}}
Atsisiųskite programos tekstą.

   Į pradžią   

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ą   

3 pavyzdys. Dvimačio masyvo sudarymas ir išvedimas

Sudarysime trikampę lentelę, kurios elementai lygūs indeksų sumai. Panagrinėkite, kaip pakeitėme išvedimo metodą, kad jis išvestų masyvą eilutėmis.
 public class Lentel {
public static void main (String [] args )
{new Lentel();}

Lentel () {
int [][] lent = new int [5][];
for (int i=0; i<5; i++) lent[i] = new int [i+1];

for (int i=0; i<5; i++) 
{for (int j=0; j< lent[i].length; j++)
lent[i][j]=i+j; }

for (int i=0; i<5; i++) 
isvedimas(lent[i]);
}

public  void isvedimas(int [] masyv)
{for (int i=0; i< masyv.length; i++)
System.out.print(masyv[i]+" ");
System.out.println();
}}
Atsisiųskite programos tekstą.

   Į 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.   
Atsisiųskite programos tekstą.

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.");
}
}
Atsisiųskite programos tekstą.

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");	
}	}
Atsisiųskite visą kodo tekstą.

Hashtable klasė

Objektai, saugomi vektoriuje identifikuojami pagal įrašų eilės numerius. Hashtable klasė irgi skirta dinaminiams duomenų masyvams kurti, tačiau šiose struktūrose saugomi duomenys identifikuojami pagal įvedamus raktų objektus - pavyzdžiui, pagal String tipo duomenis.

Tuščią hash-lentelę galime sukurti taip:
        Hashtable lentele = new Hashtable ();
Keletas Hashtable klasės metodų
Metodo tipas, vardas Metodo darbas
Object get ( Object rakt) Perduoda lentelės elementą, kurio raktas yra rakt.
Object put ( Object rakt, Object obj) Patalpina objektą obj, kurio raktas bus rakt.
Object remove ( Object rakt) Pašalina lentelės elementą, kurio raktas yra rakt.
int size() Pasako, kiek jau yra įrašų.
void clear() Ištrina visus įrašus.

Užduotys

  1. Parašykite kodą programos (arba įskiepio), kuri apskaičiuotų binominius koeficientus (Paskalio trikampio elementus), sudarytų iš jų masyvą ir išvestų į ekraną ar teksto išvedimo lauką.

  2. Parašykite kodą įskiepio, kuriame būtų sudaromas masyvas iš objektų - spalvų kodų. Kiekviename tokiame objekte turi būti saugomos trys reikšmės: raudonos, žalios ir mėlynos spalvos parametrai. Suprogramuokite metodą, kuris, nurodžius masyvo elemento indeksą, pagal masyvo elemente saugomus kodus sudarytų spalvą ir nubražytų šia spalva, pavyzdžiui, stačiakampį.

  3. Parašykite kodą įskiepio, kuriame būtų sudaromas masyvas iš objektų - saugančių informaciją apie knygas. Kiekviename tokiame objekte turi būti saugomos trys reikšmės (String tipo duomenys): autorius, pavadinimas ir išleidimo metai. Suprogramuokite metodą, randantį knygas, išleistas nurodytais metais ir išvedantį informaciją į ekraną.

  4. Parašykite programą (arba įskiepį), masyvui iš objektų, saugančių informaciją apie kampus, sudaryti. Objekte turi būti saugoma: kampo didumas laipsniais, didumas radianais, sinusas, kosinusas ir tangentas. Suprogramuokite metodą, kuris išvestų nurodyto masyvo elemento informaciją į ekraną.

  5. Parašykite programą, kuri įvedus natūralųjį skaičių n būtų sudarytų dvimatį masyvą skait[][]. Jo eilutėse skait[i][] 0<=i<9 turi būti saugomi skaičiaus n išraiškos (i+1)-tainėje skaičiavimo sistemoje skaitmenys (dvejatainėje, trejetainėje,..., dešimtainėje). Masyvo eilutės turi būti skirtingo ilgio. Sudarytą masyvą reikia išvesti į ekraną.

  6. Parašykite programą telefonų knygai sudaryti. Telefonų knyga tegu bus Vector klasės objektas. Įrašuose saugoma: pavardė ir telefono numeris. Reikia suprogramuoti metodus: įrašymo (įvedama ir įrašoma pavardė ir telefono numeris); skaitymo (nurodžius įrašo numerį, įrašas išvedamas į ekraną); trynimo (nurodžius įrašo numerį, įrašas pašalinamas).

  7. Parašykite programą adresų knygai sudaryti. Adresų knyga tegu bus Hashtable klasės objektas. Įrašuose saugoma: vardas (tai raktas) ir adresas (simbolių eilutė). Suprogramuoti įrašymo metodą ir adreso išvedimo pagal raktą metodą.

  8. Parašykite programą krepšinio komandos rungtynių rezultatų lentelei sudaryti. Lentelė tegu bus Hashtable klasės objektas. Įrašuose saugoma: data (įrašo raktas), varžovų komandos pavadinimas, rezultatas. Suprogramuoti įrašymo metodą ir įrašo išvedimo pagal pateiktą raktą metodą.

  9. Parašykite programą, kurį sudarytų sąrašą, kuriame saugomos trikampio viršūnių koordinatės. Tegu tas sąrašas bus Vector klasės objektas. Įraše saugomos šeši skaičiai (trys skaičių poros). Suprogramuoti įrašo įvedimo metodą. Be to - metodą, kuris išvestų nurodytą įrašą ir pasakytų, ar trikampis smailusis, statusis ar bukasis.

  10. Parašykite programą, kuri sudarytų masyvą lošimo kauliuko mėtymo rezultatams saugoti. Masyvas turi būti dvimatis; masyvo elementams masyvas[i] [n_i] priskiriami i-osios metimų serijos rezultatai. Kiekvienoje serijoje metimų skaičius gali būti skirtingas, jį reikia įvesti. Rezultatai generuojami naudojant atsitiktinių skaičių generavimo metodą Math.random(). Suprogramuoti metodą, kuris išvestų nurodytos bandymų serijos rezultatus. Suprogramuoti metodą, kuris pasakytų, kiek kartų i-ojoje serijoje atvirto x akučių (x gali būti 1,2,...,6).

   Į pradžią