Java HasMap – Key & Value

Java’da şuana kadar ilerlediğim kadarıyla bir çok data tutan collection mevcut. Çeşitli ihtayaçlar için bir çok collection tipi geliştirilmiş. Bunlardan hoşuma giden actionscript’de “Dictionary” sınıfı olarak geçen “HasMap” kavramından bahsedeyim kısaca.

Buradaki amaç sadece string türündeki veriyi key-value yani anahtar değeri ve içeriği olarak saklıyor. Yani Primitif bir yapıya sahip değil bu açıdan da gayet kullanışlı verilen değerleri string türünden arayıp silme işlemini dinamik olarak yapmanızı sağlıyor. Örnek vermek gerekise bir tablomuz var ve tablomuzun adı “Tablo 1” ve bunun key değeri ise “Tablo1” burada eğer biz “Tablo 1” tablosunu silmek istersek HasMap’in “remove()” metoduyla ismini vererek hemen halledebiliyoruz.

Map<String, String> hasMapOrnek = new HashMap<String, String>();
		// hasMap collectiona değer set ederken "put" yardımcı metodunu kullanıyoruz
		hasMapOrnek.put("anahtar1", "value1");
		hasMapOrnek.put("anahtar2", "value2");
		hasMapOrnek.put("anahtar3", "value3");
		
		System.out.println(hasMapOrnek.get("anahtar2"));
		
		// value2 değerini silmek istiyorsam
		hasMapOrnek.remove("anahtar2");

Advertisements

Dizi içerisinde karakter filtreleme

Bugün güzel bir metod ile karşılaştım. Daha önceden bunu denemiştim ama işime yaracağı aklıma gelmezdi. Şuanda işime büyük ölçüde yaradığı için buraya yazma gereği duyuyorum. Array.every() bir çok programlama dilinde bulunuyor aslında. Kullanımı ise basit. Array.every() metodu içine bir callBack metodu çağırıyor. Bu metodun içinde ise (element,index,array) argümanları içeriyor. Biz karakterlerimizi bu argümanlara göre işlem yapıyoruz.


var array:Array = new Array("serhat","123456");
var stats:Boolean = array.every(controlCharLimit);

if(stats)
{
	// OK. do it.
}

function controlCharLimit(element:String , index:Number , array:Object)
{
	if (element.length == 6)
	{
		return true;
	}
	else
	{
		return false;
	}
}

as3 nested array with object

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;

// Kütüphanedeki objeleri sahneye ekliyorum. 
// addChild işlemini başka bir işlemde yapıyorum.
var roof:libRoofSouth = new libRoofSouth();
roof.name = "libRoofSouth";
var ramp:libRampWest = new libRampWest();
ramp.name = "libRampWest";
var plain:libPlainBlock = new libPlainBlock();
plain.name = "libPlainBlock";
var chest:libChestClosed = new libChestClosed();
chest.name = "libChestClosed";
var ramp2:libRampSouth = new libRampSouth();
ramp2.name = "libRampSouth";

// Objeleri dizilere ekleyip daha sonra istediğim gibi ekleme çıkartma yapabiliyorum.
var array1:Array = [ramp, plain, plain, ramp2];
var array2:Array = [plain,plain,plain,plain];
var array3:Array = [chest, chest, chest, chest];

// Bütün dizilerimi bir tane array içinde tutuyorum.
var level:Array = [array1,array2,array3];

/*
	conditions
		@i = column
		@j = row
*/

// Level'ı döngüye sokuyorum...
// Bu durumda 3 kere döngü dönecektir. 0,1,2 şeklinde.
for(var i:int = 0; i &lt; level.length; i++)
{
	trace(i);
	// Bu döngüde ise yukarıda oluşturulan dögünün içine giriyor yani şu şekilde bi işlem oluyor
	// Herşeyi içine alan dizinin içindeki array'in değerleri al.
	// array[0]
	// array[array1] = içinde değeleri alacak yani hangi objeleri eklediysek. gibi...
	for(var j:int = 0; j &lt; level[i].length; j ++)
	{
		var ObjectClass:Class = getDefinitionByName(level[i][j].name) as Class;
		var bmd:BitmapData = new ObjectClass() as BitmapData;
		
		var imgBmp:Bitmap = new Bitmap(bmd);
		imgBmp.x = 5 + imgBmp.width * j;	// İlk olarak x koordinatını ayarlıyoruz. bu durumda 0,1,2,3,4... ile imgBmp'nin width'i çarpılacak.
		imgBmp.y = 210 - (imgBmp.height-50) * i; // Daha sonra Sütün sayısına göre ekliyoruz. 0,1,2 şeklinde olacaktır.
		addChild(imgBmp);		
	}
}

as3 insert a link into array

Actionscript’deki array kullanımında çok esnek davranmışlar bi çok kolaylığı sağlıyor arraylerle çalışırken, ayrıca yeni bir array sisteminide eklediler. Yani bi açıdan baktığımızda arrayleri kullanmamız işimizi kolaylaştırabiliyor bazı noktalarda. Kısa verileri depolamak, etiketleri dizi içerisinde biriktirmek vs. gibi işlemlerde array yapılarını kullanabiliriz. Ben de menü yapılarında etiketleri genelde array’in içerisinden alıyorum. Ama linkleme sisteminde de click eventinde if kontrolyüle hangi butona tıkladığını kontrol edip ona göre linkleme yapıyordum. Eğer birden fazla link varsa if koşulu bir o kadarda uzuyordu. Bunu en aza indirgemek için linklerede belirli bir atama yaparak kurtarabiliyorum. Aşağıda bir örneği var.

Aşağıdaki kodda for döngüsünde arraylerimizin elemanlarını listeliyoruz. Daha sonra eachArray metodunun split() fonksiyonuyla belirlediğim ayracı buluyorum. Daha sonra clicklediğim eventte eğer link yolu varsa linke gidiyor, eğer yoksa sayfa numarasına gidiyor. 

var array:Array = new Array("Anasayfa","Hakkımda","İletişim","Ürünler|http://www.link.com");

for (var i:int = 0; i<array.length; i++)
{
	var lbl:libLink = new libLink();
	addChild(lbl);
	lbl.x = 150;
	lbl.y = 40 + i * 40;

	var eachArray:Array = array[i].split("|");
	lbl.txt.text = eachArray[0];
	lbl.linkPage = eachArray[1];
	lbl.itemNo = "" + i;
	lbl.addEventListener(MouseEvent.CLICK, clickPage);

}

function clickPage(event:MouseEvent):void
{
	var mcSelected:MovieClip = event.currentTarget as MovieClip;

	if (mcSelected.linkPage != undefined)
	{
		navigateToURL(new URLRequest(mcSelected.linkPage),"_blank");
	}
	else
	{
		changePageNum(mcSelected.itemNo);
	}
}

function changePageNum(pageIndex:int = 0)
{
	trace("sayfa numarası " + pageIndex);
}

as3 Array’den seçilen objeyi kaldırma

Uzun başlıkları sevmeyip tekrardan uzun başlık atan birisiyim. Buda ilginç 🙂 Neyse, olay şu şekilde cereyan etti şimdi ben tıkladığım objemin sahneden kalkmasını(aynı zamanda array’den remove etmesini) istiyordum. Baktım ettim sonunda kendime yardımcı bir fonksiyon yaptım. Buyurun ihtiyacı olan sömürebilir 🙂


var array:Array = new Array("a","b","c","d","e","f");

arrayRemoveCurrentItem(array,"e", 1);

function arrayRemoveCurrentItem(item:Object, char:Object, quantiy:int):void
{
	if(item !== null && item is Array)
	{
		item.splice(item.indexOf(char), quantiy);
		char = null;
		quantiy = undefined;
	}
}

trace(array);

Aynı zamanda bunu movieclip içinde deneyebilirsiniz. Sonuçta alınan iki argümanda Object türünden olduğu için hiç bir sıkıntı çıkarmayacaktır. Yanlız ilk argümanı Array vermeye dikkat etmek gerekiyor. Movieclip ile ilgili örnek;

var array:Array = [mc0,mc1,mc2];

for (var i:int=0; i<array.length; i++)
{
	array[i].addEventListener(MouseEvent.CLICK, clickItem);
}

function clickItem(event:MouseEvent):void
{
	arrayRemoveCurrentItem(array,event.currentTarget as MovieClip, 1);
}

function arrayRemoveCurrentItem(item:Object, char:Object, quantiy:int):void
{
	if (item !== null && item is Array)
	{
		item.splice(item.indexOf(char), quantiy);
		char.visible = false;
		char = null;
		quantiy = undefined;
	}
}

trace(array);

Random Değerler Üretmek (Shuffle Array)

Actionscript projelerimizde gerek dinamik , gerekse statik yani kod ile oluşturduğumuz dizilerde ya da dışarıdan gelen dataları random çekme gibi bir ihtiyaç duyabiliriz. Bunun için yapmamız gereken random değerleri üretmek olacaktır. Bunun için Math.random() sınıfı kullanarız. Fakat datalarımızı rastgele çekebilmek için belli bir yapıyı kullanmamız gerekir. Datalarımızı bir fonksiyona çekeriz ve bu fonskiyonda belli bir algoritmada işlemlerimizi gerçekleştiririz.

İlk olarak fonksiyona argüman olarak bir array tanımlarız ve bu arrayin içindekileri kontrol edebilmek için tersden bir for döngüsüne sokarız. Tersden kastım dizinin boyutu kadar azalmasını sağlamak. 10..9..8.. gibi… Ayrıca random sayıları elde edebilmek içinse bir adetde randım sayı üretici yapmamız gerekiyor. Bunun içinde basit bir işlem yapıcaz argüman olarak sayı vericez ve bunu Math.random ile çoğaltacak bu kadar basit. Kısaca koda geçelim o daha iyi anlatacaktır ve daha iyi anlayacaksınızdır.

function getRandom(num:int):int
{
	return Math.floor((Math.random() * num));
}

function shuffleArray(array:Array):Array
{
	for(var i:int = array.length; i &gt; 1; i--)
	{
		var j:int = getRandom(i);
		var tempArray:String = array[j];
		array[j] = array[i-1];
		array[i-1] = tempArray;
	}
	return array;
}

Şimdi kısaca koddan bahsedecek olursak; j değişkeni getRandom() metoduna gönderiyor ve ordan bize rastgele bir sayı üretiliyor. Daha sonra biz bu sayıları kullanarak arrayden rastgele elemanlar alıyoruz. Örneğin 5. indeksdeki bir değeri alıyoruz. Daha sonrasında ise bunu tempArray adındaki bi değişkene atıyoruz. Bunu aşağıdaki son elemana atıyoruz. Bu sayede sürekli karışık verileri elde etmiş oluyoruz. Kullanımı ise aşağıdaki gibi olmalıdır.

var array:Array = new Array("xx","yy","bb","cc","qq","ee","bn","jjk","üü","oo","ee","11","222");

var a:Array = shuffleArray(array);
trace(a);

ArrayList Kullanımı

c# ile Array kullanımında objelere değer sayısı atamamız gerekir. Bu gibi durumlarda int,string,double,byte,long vs. gibi yapıları kullanırız ve yapıların boyutlarını belirtirken köşeli parantezler içerisine [10] gibi değerler gireriz. Aşağıda array kullanımını ve arrayList kullanımının farkını anlatmak adına bir adet array ve arraylist oluşturuyorum.

 string[] isimler = new string[3]{"Serhat","Sezer","Developer"};

bu şekilde çıktı alabilmek için yapmamız gereken tek şey. isimler[0] gibi ulaşabiliyoruz. Fakat alışveriş sepeti gibi uygulamalarda kullanıcının ne kadar ürün ekleyebileceğini bilmediğimiz için dinamik bir array oluşturamıyoruz. Bunun için ArrayListleri kullanabiliyoruz.

namespace ArrayList_Kullanimi
 {
 class Program
 {
 static void Main(string[] args)
 {
 OrnekArrayList();
 }
static void OrnekArrayList()
 {
 // kolleksiyon sınıfı oluşturulur.
ArrayList koleksiyonlar = new ArrayList();
// Kolleksiyona Object türünde değerler eklenir.
koleksiyonlar.Add("Serhat Sezer");
 koleksiyonlar.Add(20);
 koleksiyonlar.Add(new DateTime(17,2,2));
// Koleksiyon elemanlarına, dönüşüm(cast) yaparak erişilir. Çünki koleksiyon içerisinde Object türüne çevirerek oluşturlur ve kullanılır.
string adi = (string)koleksiyonlar[0];
 Console.WriteLine("Koleksiyondaki 1. Elemana erişildi\n " + adi);
// Koleksiyondaki elemanların tümüne erişilir : herhangi bir döngü türü ile olabilir.
Console.WriteLine("Kolleksiyondaki bütün elemanlara erişebilirsiniz...");
foreach(object item in koleksiyonlar)
 {
 Console.WriteLine(item);
 }
Console.ReadLine();
 }
 }
 }

ArrayList yapısı bize birden fazla veritipini eklememize olanak sağlıyor. Yani bir ArrayList objesinin içerisine string,double,long,int,uint,short gibi bir çok özellik ekleyebiliyoruz. Bunu yaparken ArrayList’in Add() metodunu kullanıyoruz. Fakat bu eklediğimiz nesneleri kullanabilmek için (türüne göre – int ,string , double- vs) tür dönüşümü yapmamız gerekiyor.

Yukarıdaki örnekte görüldüğü gibi 1. indekse sahip olan eleman 20 sayısını barındırıyor, Biz bunu kullanabilmek için 20 sayısını stringe çevirip işlememiz gerekiyor bunun için yapmamız gereken yol;

string yasi = (string)kolleksiyonlar[1];

Yukarıda yaptığımız kodda ise aldığımız number bir değeri string veri tipine çevirebiliyoruz.