Merhaba arkadaşlar,bugün yine javada bir soruyu çözeceğiz.Sorumuz şöyle:
Elinizde bir miktar farklı boylarda somun ve bu somunlara uyacak civatalar olsun.Civataları somunlara eşlemek için nasıl bir algoritma yazarsınız.Bu algoritmanın zamansal karmaşıklığı ne olur ?
Şimdi bu soruyu çözerken iki farklı dizi oluşturacağız ve bu iki farklı diziye civata ve somunları eşleştireceğiz.Ben somunları civatalardan biraz daha büyük yaptım çap bakımından düşündüğüm için(Yanlış biliyor olabilirim ama çok farketmez)..Uygun eşleşmez için dizileri sıralamamız lazım..Bu dizileri sıralarken elemanların hepsini birbiriyle karşılaştırdım ve her seferinde en küçüğünü bularak başa dizdim.Bunu yapan metodum da generic(genel) tipte olduğu için; hem integer türündeki vida dizimi,hem de double türündeki somun dizimi sıralayacak kapasitede oldu.Aynı şekil generic olarak tanımladığım diziGoster fonksiyonumuzla da her türden diziyi yazdırabiliyor(Referans tipte olması şartı ile)..Sıralama yaptıktan sonra sırayla dizinin aynı indexteki elemanlari eşitleyerek ekranda gösterdim..Bu da kodumuz:
[java] public class SomunVida { public static void main(String[] args) { Integer[] arrCivata = {1, 4, 2, 5}; Double[] arrSomun = {1.1, 4.4, 2.2, 5.5}; arrCivata = diziSirala(arrCivata); //diziGoster(arrVida); arrSomun = diziSirala(arrSomun); // diziGoster(arrSomun); System.out.println("Eşleşme"); System.out.println("Somun Vida"); for (int i = 0; i < arrSomun.length; i++) { System.out.println(arrCivata[i] + " " + arrSomun[i]); } } //Generic tipte bir dizi elemanlarini yazan metot tanimladik public static <T> void diziGoster(T[] arrTmp) { System.out.println(""); for (T number : arrTmp) { System.out.print(number + " - "); } System.out.println(""); } //Yine generic tipte bir dizi siralama metodu tanimladik /* Bu metot sayilardan tureyen her seyi parametre olarak alabilir.. ...ve siralayabilir */ public static <T extends Number> T[] diziSirala(T[] arrTmp) { for (int i = 0; i < arrTmp.length; i++) { for (int j = 0; j < arrTmp.length; j++) { /* Burda generic tipleri karsilastiramadigimizdan önce Stringe, ardından double a cevirdim */ if (Double.parseDouble(arrTmp[i] + "") < Double.parseDouble(arrTmp[j] + "")) { T tmpNumber = arrTmp[i]; arrTmp[i] = arrTmp[j]; arrTmp[j] = tmpNumber; } } } return arrTmp; } } [/java]
Çıktımız:
run:
Eşleşme
Somun Vida
1 1.1
2 2.2
4 4.4
5 5.5
BUILD SUCCESSFUL (total time: 0 seconds)
Kodu biraz daha kısaltıp sadeleştirelim bazı arkadaşlar için 🙂
[java] public class SomunCivataEslestirme{ public static void main(String[] args) { int[] arrCivata = {1, 2, 5, 6}; int[] arrSomun = {5, 2, 1, 5}; arrCivata = diziSırala(arrCivata); arrSomun = diziSırala(arrSomun); for (int i = 0; i < arrCivata.length; i++) { System.out.println("Somun : " + arrSomun[i] + " - Civata : " + arrCivata[i]); } } public static int[] diziSırala(int[] arrtTmp) { for (int i = 0; i < arrtTmp.length; i++) { for (int j = 0; j < arrtTmp.length; j++) { if (arrtTmp[i] < arrtTmp[j]) { int tmp = arrtTmp[i]; arrtTmp[i] = arrtTmp[j]; arrtTmp[j] = tmp; } } } return arrtTmp; } } [/java]