Bölüm 3 - Java da Programlama Yapılarının Temelleri 6

Big Numbers

Eğer ki bizim temel integer yada floating-point tiplerinde kullandığımız hassasiyet yeterli değilse java.math paketi altında bulunan BigInteger yada BigDecimal classlarını kullanabiliriz. BigInteger class'ı hassasiyeti integer arithmetic olarak ayarlarken, BigDecimal'da aynı şeyi floating-point sayılar için yapar.

BigInteger a = BigInteger.valueOf(100);

Daha uzun sayılar için String parametreli bir constructor üretmeliyiz.

BigInteger reallyBig = new BigInteger("2345787654345678765434567876543234567890987654321234567890");
// CONSTANTS
BigInteger one = BigInteger.ONE;
BigInteger two = BigInteger.TWO;
BigInteger ten = BigInteger.TEN;

!! UYARI : Her zaman BigDecimal kullanırken String parametreli olan constructoru kullanılmalıdır çünkü BigDecimal(double) isimli bir constroctur olduğu için bu roundoff hatalarına sebebiyet verebilir. Örneğin new BigDecimal(0.1) çıktısı 0.1000000000000000055511151231257827021181583404541015625 budur.

Yukarıdaki classları kullanırken bizim matematik operatorlerimiz olan +,* bunları kullanamayız bunun için methodları kullanmak zorundayız.

BigInteger c = a.add(b); // c = a+b
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2))); // d = c*(b+2)

java.math.BigInteger

Method Açıklaması
BigInteger add(BigInteger other) Toplama için kullanılır.
BigInteger subtract(BigInteger other) Çıkarma için kullanılır.
BigInteger multiply(BigInteger other) Çarpma için kullanılır.
BigInteger divide(BigInteger other) Bölme için kullanılır.
BigInteger mod(BigInteger other) Mod alma için kullanılır.
BigInteger sqrt() Karekök almak için kullanılır.
int compareTo(BigInteger other) Eğer ki other'a eşit ise 0 , eğer ki bigInteger deierğ other'dan küçük ise negatif, büyük ise positive değer döner.
static BigInteger valueOf(long x) değeri x'e eşit olan büyük bir tam sayı döndürür.

java.math.BigDecimal

Method Açıklaması
BigDecimal(String digits) Verilen digitslerle bir BigDecimal nesnesi construct edilir.
BigDecimal add(BigDecimal other) Toplama için kullanılır.
BigDecimal subtract(BigDecimal other) Çıkarma için kullanılır.
BigDecimal multiply(BigDecimal other) Çarpma için kullanılır.
BigDecimal divide(BigDecimal other) Bölme için kullanılır.
BigDecimal mod(BigDecimal other) Mod alma için kullanılır.
BigDecimal sqrt() Karekök almak için kullanılır.
int compareTo(BigDecimal other) Eğer ki other'a eşit ise 0 , eğer ki bigInteger deierğ other'dan küçük ise negatif, büyük ise positive değer döner.
static BigDecimal valueOf(long x) değeri x'e eşit olan büyük bir tam sayı döndürür.

Diziler (Arrays)

Arrays aynı tipte bulunan değerleri sırasıyla tutan veri yapısıdır.

Declaring Arrays (Arrayleri Bildirme)

Bir array aynı tipte verilerin tutulduğu bir veri yapısıdır ve içindeki herhangi bir değere erişmek istersek bunu da index yapısıyla erişimi sağlarız.

Array declaration yapmak için array tipi ve hemen akabinde [] parantezler, bir de array variable name gelir.

int[] a; // array declaration not initialization.

Eğer ki bir array'i başlatmak istiyorsak initialization için new keywordünü kullanmamız gereklidir.

int[] a = new int[100]; // yada var a = new int[100]

100 adet tam sayı tutan bir int array tipi tanımladık.

Array tanımladıktan sonra artık bunun uzunluğunu değiştiremeyiz. Eğer ki biz arraylerin uzunluğunu sık sık değiştirmemiz gerekiyorsa bunun için array lists (Collectionlarda) kullanmamız gereklidir.

Not : Java'da arrayleri

int[] a;
int a[];

iki şekilde de declarationu yapabiliriz ama genelde veri tipinden hemen sonra parantez bırakılması okunak açısında daha iyidir.

Java'da başka bir yol ile arrayleri initalize edebiliriz, tek satırda hem declaration hem de initialization.

int[] smallPrimes = {2,3,5,7,11,13};
String[] authors = {"James Gosling","Bill Joy"};

İstersek anonymous array'de tanımlayabiliriz.

int[] anonymousArray = new int[] {17,19,23,29,31,37};

Bu ifade yeni bir array ayrırır ve içerisini de bizim belirttiğimiz değerlerle doldurur. Daha sonrasında bu değerlerin sayısını hesaplayarak array'in lengthini belirler. Bunu daha çok elimizde bulunan bir array'i tekrardan initalize etmemiz gerektiğinde kullanırız mesela.

smallPrimes = new int[] {17,19,23,29,31,37};

bu ifade şunun kısaltmasıdır.

int[] anonymous = {17,19,23,29,31,37};
smallPrimes = anonymous;

Array-Dizi Elemanlarına Erişme

Dizinin elemanları 0'dan başlar ve son değeri de uzunluğun-1 şeklindedir. Biz index denen kavramla erişim sağlarız.

int[] a = new int[100];
for(int i = 0;a.length;i++){
  a[i] = i; // Array'ın içerisini 0-99 arasında doldurur.
}

Biz bir array oluşturduğumuzda bütün elemanlar 0 ile dolar. boolean tipi için false, object'ler için null. Örneğin:

String[] names = new String[10];

10 tane String tipinde bir array oluşturur ve bütün hepsinin değeri null'dur. Eğer ki boş bir değer içermesini istersek:

for(int i = 0;i<10;i++) names[i] = "";

Eğer ki bir array'in uzunluğunu bulmak istersek array.length kullanabiliriz.

"for each" döngüsü

Java'da enhanced loop olarak değindiğimiz, for-each döngüsü vardır, syntaxı:

for(variable : collection) statement

Verilen collectionun her elemanı üzerinde gezinir ve daha sonrasında gerekli statemeni çalıştırır. Collection ifadesi kesinlikle bir array yada Iterable interfaces'ini implement eden bir nesne olmalıdır,mesela ArrayList gibi.

for(int element : a){
  System.out.println(element);
}

Not : For each loop (enhanced for loop) elemanlar üzerinde gezinir, index'ler üzerinde değil.

Eğer ki bir array'i döngüler aracılığıyla değil de direkt olarak String şeklinde bastırmak istersek:

Arrays.toString(a); şeklinde bastırabiliriz.

int[] a = new int[] {1,2,3,4};
System.out.println(Arrays.toString(a)); // [1, 2, 3, 4]

Array Copying (Dizi Kopyalama)

Bir array değişkenini diğerine kopyalayabiliriz ve bu sayede her iki değişken de aynı array'e referans verecektir.

int[] smallPrimes = {2,3,5,7,11,13};
int[] luckyNumbers = smallPrimes;
luckyNumbers[5] = 12; // smallPrimes[5] artık 12 oldu

Eğer ki referansı değil de sadece içeriğini kopyalamak istersek Arrays.copyOf(yeni,uzunluk) şeklinde methodu kullanmamız gereklidir.

int[] smallPrimes = {2, 3, 5, 7, 11, 13};
int[] luckyNumbers = smallPrimes;
int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers, luckyNumbers.length);
System.out.println(Arrays.toString(copiedLuckyNumbers));

Command-Line Parameters

En başından beri bildiğimiz üzere her Java programının bir tane main methodu var ve bu da String[] args içeriyor bu parametre bize dışarıdan aldığı argumanların String olduğunu belirtir.

public class Message {

    public static void main(String[] args) {
        if (args.length == 0 || args[0].equals("-h")){
            System.out.println("Hello,");
        }else if (args[0].equals("-g")){
            System.out.println("Goodbye,");
        }
        // Komut satırı argümanlarını console'ya basalım.
        for(int i = 1;i<args.length;i++){
            System.out.print(" "+args[i]);
        }
        System.out.println("!");
    }

}
java Message -g cruel world

Array Sorting (Dizileri Sıralama)

Eğer ki diziyi sıralamak istersek; Arrays class'ın sort methodunu kullanabiliriz.

int[] a = new int[1000];
...
Arrays.sort(a)

Bu method QuickSort algoritmasının ayarlanmbir bir versiyonunu kullanır ve çoğu veri kümelerinde de çok etkili çalışır.

java.util.Arrays

Method Açıklaması
static String toString(XXX[] a) Diziyi String şeklinde geri döner.
static XXX[] copyOf(XXX[] a, int end)
static XXX[] copyOfRange(XXX[] a, int start,int end) Aynı tipte XXX şeklinde array'in start index'inden başlayıp end indexine kadar değerleri döner
static void sort(XXX[] a) Array'i sıralar.
static int binarySearch(XXX[] a, XXX v)
static int binarySearch(XXX[] a, int start, int end, XXX v) v değerini bulmak için dizide binary search algoritmasını kullanarak arama yapar eğer ki v bulunursa onun index'i geri döndürülür diğer durumda r'nin negative değeri döner. Unutulmamalıdır ki binarySearch için dizinin sıralanması gerekir.
static void fill(XXX[] a, XXX v) Dizinin bütün elemanlarını v değeri ile doldurur.
static boolean equals(XXX[] a, XXX[] b) Eğer ki a ve b'nin dizi uzunlukları ve içerisindeki değerler aynı ise true döner.

Multidimensional Arrays

Multidimensional arrays (Çok boyutlu diziler) birden fazla dizi içerirler yani column-row şeklinde çalışırlar. Örneğin 2 boyutlu array (matrix) yapalım.

Declare etmek için:

double[][] balances; 
balances = new double[4][3];

// Değerlerini biliyorsak eğer aşağıdaki gibi direkt olarak hem declare hem initialization yapabiliriz.
double[][] balances =
{{16, 3, 2, 13},
{5, 10, 11, 8},
{9, 6, 7, 12},
{4, 15, 14, 1}
};

Eğer ki biz array'i ekrana basmak istersek

for (double[] row : a)
  for (double value : row)
    statement

Bu şekilde basabiliriz. İstersek Arrays.deepToString(a) methodunu da kullanarak ekrana yazabiliriz.

System.out.println(Arrays.deepToString(balances));
← Bloğa Dön