Gyakorlati alapok
2 tömb uniója külön függvényekkel
Amennyiben a Tisztelt Olvasó tanulmányai során fentről lefelé halad a Honlaptérképben, ez a fejezet garantáltan még meg fogja haladni aktuális tudásszintjét, hiszen különutas függvénymegoldásokat tartalmaz (Gyakorlati alapok II. (main() + külön eljárás / függvény) című fejezetcsomagtól kezdve felfelé). A fejezetet azért illesztettem mégis ide, hogy a tömbműveletek 1 helyen, logikus egységben legyenek.
Kiindulási pontunk a 2 tömb uniója című fejezetben ismertetett kód, ezt fogjuk igényeinkhez mérten Javacsik Béla úri szabóval átszabatni:
public class Main {
public static void main(String[] args) {
int[] tomb1 = new int[] {1, 3, 5, 7, 9, 11};
int[] tomb2 = new int[] {2, 4, 6, 8, 9, 10};
int[] tombUnio = new int[tomb1.length + tomb2.length];
for(int i = 0; i < tomb1.length; i++) {
tombUnio[i] = tomb1[i];
}
int index = tomb1.length;
for(int i = 0; i < tomb2.length; i++) {
boolean benneVan = false;
for(int j = 0; j < tombUnio.length; j++) {
if (tombUnio[j] == tomb2[i]) {
benneVan = true;
break;
}
}
if (benneVan == false) {
tombUnio[index] = tomb2[i];
index++;
}
}
for(int i = 0; i < tombUnio.length; i++){
System.out.print(tombUnio[i] + " ");
}
}
}
Végeredmény (például):
1 3 5 7 9 11 13 2 4 6 8 10 12 0
Első problémánk, ha előre meghatározott számok helyett véletlenszámokkal kívánjuk feltölteni a kezdő tömböket, ekkor ugyanis figyelnünk kell, hogy 2 azonos szám ne kerüljön a tömbbe. A fenti kódból kiderül, hogy ezt eddig nem tettük meg, bár enélkül (hangsúlyozottan véletlenszámok esetében) hibás eredményeket kapunk az uniótömbben.
Ugyanakkor érdemes a véletlenszám-generáló függvényt csak egyszer megírnunk, sőt:
objektumorientált szempontból ezt kötelezően csak egyszer tehetjük meg, bár bármennyiszer hivatkozhatunk rá, azaz bármennyiszer felhasználhatjuk!
Ez a kötelezvény mindenképpen csakis különutas függvénymegoldással tartható be. De ha már itt vagyunk, hát helyezzük a funkciókat szintén külön metódusokba! Ilyetén módon a következő metódusok fognak létrejönni:
-
boolean benneVan() - azt vizsgálja, hogy a bemeneti tömbben van-e 2 azonos szám. Ha igen, újat generáltat a tombFeltoltes() metódusban,
-
tombFeltoltes() - a fenti függvény segítségével egymástól különböző véletlenszámokkal feltölti és átadja a tömböt,
-
tombkiiras() - kiírja a konzolra a tömb tartalmát,
-
tombUnio() - unió művelettel egyesít 2 bemeneti tömböt, miközben vizsgálja, hogy van-e 2 azonos szám a tömbök között. Ha a szám már szerepel, a helyet üresen hagyja (azaz 0 lesz az érték, hiszen a JVM int típusú tömbelemeket 0 értékkel inicializál). Ebből következően a 0 mennyisége megmutatja, hogy tömbegyesítéskor hány ütközés volt.
-
main() - tömblétrehozás és inicializálás után főprogram lefuttatja a metódushívásokat.
Nézzük meg a futtatható Java-kódot:
import java.util.Random;
public class Main {
public static boolean benneVan(int szam, int[] tomb) {
boolean vanIlyenSzam = false;
for (int i = 0; i < tomb.length; i++) {
if (szam == tomb[i]) {
vanIlyenSzam = true;
break;
}
}
return vanIlyenSzam;
}
public static int[] tombFeltoltes() {
int[] tomb = new int[10];
Random rnd = new Random();
int szam;
for(int i = 0; i < tomb.length; i++) {
do {
szam =
rnd.nextInt(20) + 1;
}while(benneVan(szam,
tomb));
tomb[i] = szam;
}
return tomb;
}
public static void tombKiiras(int[] tomb) {
for (int i = 0; i < tomb.length; i++) {
System.out.print(tomb[i] + " ");
}
System.out.println();
}
public static int[] tombUnio(int[] tomb1, int[] tomb2) {
int[] tombUnio = new int[tomb1.length + tomb2.length];
for(int i = 0; i < tomb1.length; i++) {
tombUnio[i] = tomb1[i];
}
int index = tomb1.length;
for(int i = 0; i < tomb2.length; i++) {
boolean benneVan = false;
for(int j = 0; j < tombUnio.length;
j++) {
if (tombUnio[j]
== tomb2[i]) {
benneVan = true;
break;
}
}
if (benneVan == false) {
tombUnio[index]
= tomb2[i];
index++;
}
}
return tombUnio;
}
public static void main(String[] args) {
int[] tomb1 = new int[10];
int[] tomb2 = new int[10];
int[] tombUnio = new int[tomb1.length + tomb2.length];
tomb1 = tombFeltoltes();
tomb2 = tombFeltoltes();
tombUnio = tombUnio(tomb1, tomb2);
tombKiiras(tomb1);
tombKiiras(tomb2);
tombKiiras(tombUnio);
}
}
Végeredmény (például):
9 10 4 2 17 15 5 8 18 7
4 20 15 17 13 11 8 1 3 5
9 10 4 2 17 15 5 8 18 7 20 13 11 1 3 0 0 0 0 0