AS3: Multidimensional Sort pada Array Object.

Terkadang ada kondisi dimana kita mempunyai sebuah array yang isinya object, lalu kita ingin melakukan sorting array tersebut,  yang parameternya adalah member object didalam array.

Contoh, jika saya punya object ini:

public class Murid
{
	public var nama:String;
	public var kelas:int;
	public var nilai:int;
	public function Murid(nNama:String,nKelas:String,nNilai:String)
	{
		nama = nNama;
		kelas = nKelas;
		nilai = nNilai;
	}
}

Kemudian, saya punya vector Murid seperti ini:

vecMurid = new Vector.<Murid>();
vecMurid.push(new Murid(3, 6, "Tio"));
vecMurid.push(new Murid(1, 5, "Andi"));
vecMurid.push(new Murid(2, 8, "Lina"));
vecMurid.push(new Murid(1, 10, "Dedi"));
vecMurid.push(new Murid(2, 7, "Melisa"));

Sekarang, saya ingin mengurutkan daftar murid ini, mulai dari kelasnya yang terkecil, kemudian niainya yang terbesar, ini adalah output yang saya inginkan:

Kelas 1, Nilai 10, Dedi
Kelas 1, Nilai 5, Andi
Kelas 2, Nilai 8, Melisa
Kelas 2, Nilai 7, Lina
Kelas 3, Nilai 6, Tio

Inilah yang disebut multidimensional sort pada array yang berisikan object. Di ActionScript 3, kita bisa melakukan sorting ini dengan sangat mudah. AS3 memperkenalkan fungsi sortOn yang parameternya bisa kita custom sedemikian rupa untuk melakukan pengurutan yang kompleks, sintaks generalnya adalah:

array.sortOn('names','options');

Fungsi ini memungkinkan kita untuk mengurutkan sebuah array dengan berbagai parameter dan opsi. Misalkan saya ingin mengurutkan murid berdasarkan ‘kelas‘ dan ‘nilai‘, saya bisa memasukan ini:

sortOn(['kelas','nilai'],Array.DESCENDING);

Parameter pertama diatas adalah daftar keys yang akan digunakan untuk melakukan sorting, sementara parameter kedua adalah mode sorting. Tapi, kode diatas tidak akan bekerja, karena variabel vecMurid yang kita pakai adalah vector, dan isinya bukan array set. Jadi untuk kasus ini, kita akan ubah sedikit fungsi sortingnya seperti ini:

public function sortMurid(vec:Vector.<Murid>):Vector.<Murid> {
	var arr:Array = new Array();
	var i:int;

	for (i = 0; i < vec.length; i++) {
		arr.push({kelas:vec[i].kelas,nilai:vec[i].nilai,o:vec[i]});
	}

	arr = arr.sortOn(['kelas','nilai'], [Array.NUMERIC, Array.NUMERIC | Array.DESCENDING]);

	var vec_output:Vector. = new Vector.();
	for (i = 0; i < arr_h.length; i++) {
		vec_output.push(arr['i']['o']);
	}
	return vec_output;
}

Pada kode diatas, kita membuat fungsi yang returnnya adalah vector Murid, dan parameternya adalah vector Murid yang telah kita buat sebelumnya. Pertama-tama kita akan menyalin semua isi dari parameter pertama kedalam sebuah array, tapi tidak hanya sekedar menyalin, kita juga menambahkan 2 buah key yaitu ‘kelas‘ dan ‘nilai‘ kedalam array tersebut. Sehingga setiap membernya adalah sebuah set yang isinya ‘kelas‘, ‘nilai‘, dan ‘o‘, yaitu reference ke instance yang ada di setiap vector Murid.

Setelah itu, kita bisa langsung melakukan sorting dengan fungsi sortOn, parameter pertama adalah key set yang kita perlukan, yaitu ‘kelas‘ dan ‘nilai‘. Parameter kedua adalah dua buah set opsi yang kita gunakan untuk melakukan sorting. Opsi pertama adalah ‘Array.NUMERIC‘, yang artinya key ‘kelas‘ adalah set numeric yang di set secara Ascending. Opsi kedua adalah ‘Array.NUMERIC | Array.DESCENDING‘, yang artinya key ‘nilai‘ adalah set numeric yang harus di urut secara DESCENDING (yang terbesar akan muncul lebih dulu).

Setelah di urut, kita tinggal menyalin kembali array tersebut ke output, lalu di return ke fungsi.

And that’s it😀

Pos ini dipublikasikan di Action Script, Programming dan tag , , , , , , , , , , , , , , , . Tandai permalink.

3 Balasan ke AS3: Multidimensional Sort pada Array Object.

  1. L_O_J berkata:

    Hooo ic ic *manggut-manggut setengah headbang*

  2. Anonim berkata:

    numpang sedot ya gan buat bahan belajar ^^

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s