Gyakorlati alapok
2 tömb összefuttatása 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.
A fejezet tartalmi előzményei a következő fejezetekben olvashatók:
Az összefuttatás hasonló az unióhoz, tőle csupán abban különbözik, hogy maguk az alaptömbök is rendezettek, ezért az eredménytömbnek is rendezettnek kell lennie. A közös részek csak egyszer fordulhatnak elő. Ha nincs közös rész, azt az összefuttatási módot összefésülésnek nevezzük.
A 2 tömb uniója külön függvényekkel című fejezetben felvázoltuk az ott szükséges alapmetódusokat...
-
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,
-
main() - tömblétrehozás és inicializálás után főprogram lefuttatja a metódushívásokat.
...amelyeket most az összefuttatás jellegéből adódóan a következő metódusokkal kell helyettesítetnünk, illetve kiegészítenünk:
-
valamilyen rendezési algoritmus (ez majd egyszerű buborékrendezés lesz tombRendezes() néven). Érdekesség, hogy ehhez elégséges egy eljárás is, hiszen magát a tömböt nem kell átadnunk, csakis elemeit rendeznünk, azaz jobb, ha megtartjuk az eredeti tömböt.
-
unió helyett összefuttatási algoritmus (tombOsszefuttatas() néven), amely összefuttat 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.
-
illetve a main() főprogram hivatkozásainak kis mértékű módosítása, kiegészítése.
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(100) + 1;
}while(benneVan(szam,
tomb));
tomb[i] = szam;
}
return tomb;
}
public static void tombRendezes(int[] tomb) {
for(int i = tomb.length-1; i > 0; i--)
for(int j = 0; j < i; j++)
if(tomb[j] >
tomb[j+1]){
int tarolo = tomb[j];
tomb[j] = tomb[j+1];
tomb[j+1] = tarolo;
}
}
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[] tombOsszefuttatas(int[] tomb1, int[] tomb2) {
int[] tombOsszefuttatott = new int[tomb1.length +
tomb2.length];
int i = 0;
int j = 0;
int szamlalo = -1;
while(i < tomb1.length && j < tomb2.length) {
szamlalo++;
if(tomb1[i] < tomb2[j]) {
tombOsszefuttatott[szamlalo] = tomb1[i++];
}else if(tomb1[i] == tomb2[j]) {
tombOsszefuttatott[szamlalo] = tomb1[i];
i++;
j++;
}else if(tomb1[i] > tomb2[j]) {
tombOsszefuttatott[szamlalo] = tomb2[j++];
}
}
while(i < tomb1.length)
tombOsszefuttatott[++szamlalo] =
tomb1[i++];
while(j < tomb2.length)
tombOsszefuttatott[++szamlalo] =
tomb2[j++];
return tombOsszefuttatott;
}
public static void main(String[] args) {
int[] tomb1 = new int[10];
int[] tomb2 = new int[10];
int[] tombOsszefuttatott = new int[tomb1.length +
tomb2.length];
tomb1 = tombFeltoltes();
tomb2 = tombFeltoltes();
tombKiiras(tomb1);
tombKiiras(tomb2);
tombRendezes(tomb1);
tombRendezes(tomb2);
System.out.println();
tombKiiras(tomb1);
tombKiiras(tomb2);
System.out.println();
tombOsszefuttatott = tombOsszefuttatas(tomb1, tomb2);
tombKiiras(tombOsszefuttatott);
}
}
Végeredmény (például):
75 71 52 11 72 1 87 49 28 43
26 57 5 62 87 72 35 14 39 80
1 11 28 43 49 52 71 72 75 87
5 14 26 35 39 57 62 72 80 87
1 5 11 14 26 28 35 39 43 49 52 57 62 71 72 75 80 87 0 0