26 Kasım 2015 Perşembe

Sıkıştırma - ZipFile

Giriş
Sınıfları kullanmak için şunları import etmek gerekir.
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
ZipFile Sınıfı
constructor
Sınıf şöyle kurulur.
Path pathToFile = ...
ZipFile zipFile = new ZipFile(pathToFile.toFile());
entries metodu
Girdilere erişmemizi sağlar
ZipFile zipFile = ...
Enumeration<? extends ZipEntry> entries = zipFile.entries();

while (entries.hasMoreElements()) {
  ZipEntry entry = entries.nextElement();
  ...
}
size metodu
Kaç tane girdi (dosya veye dizin) olduğunu döndürür.
if (zipFile.size() != 1) {...}


Random Number Generator Kullanımı

Math.Random
Bu sınıfın açıklamasında [0 - 1.0) arasında sayı üretir yazıyor. Kastedilen şey [0-0.9999999999999) arasında sayı üretir gibi bir cümle. Evet 1.0 hiç bir zaman üretilmez ama bu sayıya çok yakın bir sayı da üretebilir. Dolayısıyla aşağıdaki kod [0-26] arasında bir sonuç döner
System.out.println((int)(Math.random() * 27));
Random
Random Sınıfı yazısına taşıdım.

Belli Aralıklarda Int Sayı Üretmek
Java 7'den önce
Temel formül şu
minimum + rn.nextInt(maxValue - minvalue + 1)
Formül şöyle çalışıyor. Diyelimki [10 - 20] arasında sayı üretmek istiyoruz.
nextInt metoduna geçilen maxValue - minvalue + 1 ile [0,11) arasında sayı üretiriz. Üzerine 10 ekleyince [10,21) arasında sayı üretiriz.

Şöyle yaparız.
public static int randInt(int min, int max) {
    Random rand (...); //initialize
    int randomNum = rand.nextInt((max - min) + 1) + min;
    return randomNum;
}
C#'ta bu işi hazır olarak yapan Next(int minValue,int maxValue) metodu var.

Java 7'den sonra
ThreadLocalRandom yazısına taşıdım

Belli Aralıklarda Double Sayı Üretmek
Eksi- Artı Aralığında NextDouble
Eğer istenilen aralık [x,y] eksi sayıdan artı bir sayıya kadarsa nextDouble() veya nextInt() metoduna geçilecek sayı, aralığın 2 katı * [-0.5 - +0.5] arasında sayı üreten üreteç olmalı. [-PI, + PI] arasında sayı üretme örneği:
private static readonly Random rand = new Random();

void DrawRandom()
{
    float angle = 2 * Math.PI * (rand.NextDouble() - 0.5);
    float x = Math.Sin(angle);
    float y = Math.Cos(angle);
    // do something
}
4 Haneli Sayı 1-6 Rakamlarını Kullanan Sayı Üretmek
Basit bir örnek şöyle. Yukarıdaki aralık formülünün burada da uygulandığı görülebilir.
Random r = new Random();
int number = 0;
int d = 1;

while (number < 1000) {

    // generate number between 1-6
    int num = r.nextInt(6) + 1;

    number += num * d;
    // increase the digit (units, tens, hundreds, thousands)
    d *= 10;
}

System.out.println(number);
Dağılım Sınıfı
Java'da dağılım sınıfı yok. Bir tek Gaussian dağılım yapan, nextGaussian() metodu var.
Random rnd = new Random();
double value = rnd.nextGaussian();