Laporan Tugas
A. Simulasi Multi Level Marketing (MLM)
Tugas I
Struktur Data dan Algoritma
Oleh:
Canggih Pramono Gultom
1006826295
I. Deskripsi Tugas
Pada suatu hari, pimpinan dari PT. Fasilkom Jaya ingin mencoba untuk menggunakan sistem
multi-level-marketing atau yang biasa disebut MLM pada perusahaannya dengan tujuan untuk
meningkatkan pendapatan dari perusahaan. Anda sebagai programmer di perusahaan PT. Fasilkom
Jaya diminta untuk membantu implementasi dari sistem ini supaya penambahan anggota dapat
dilakukan dengan mudah dan terkontrol. Oleh karena sistem MLM membentuk suatu tree, dimana
terdapat upline dan downline, maka untuk mengimplementasikan sistem
kepegawaian Anda diminta untuk menggunakan struktur data tree.
Berikut ini adalah kriteria yang diharapkan:
Setiap node pada tree merepresentasikan seseorang yang tergabung di dalam MLM. Setiap
orang yang tergabung dengan MLM tersebut disebut dengan Person.
Informasi yang dimiliki setiap orang yang tergabung dalam sebuah MLM adalah nama, jenis kelamin,
tanggal lahir, total penjualan yang dilakukan (sales value), gaji, marketing level.
Nama orang yang dijadikan input dijamin selalu unik.
Child dari PersonX adalah semua Person yang menjadi bawahan langsung dari PersonX. Jika
digambarkan sebagai tree, selisih level antara parent (PersonX) dan child-nya pada suatu tree
adalah 1.
Downline dari Person X adalah semua Person yang berada dibawah Person X. Jika digambarkan
sebagai tree, level dari suatu Person X selalu lebih besar daripada level Person downline-nya.
Asumsi yang digunakan supaya tree ini terkait menjadi satu tree, root dari Persontree ini adalah
sebuah instance yang dinamakan BIGBOSS.
Operasi yang dapat dilakukan terhadap MLM Tree adalah insert, delete, update, search, count
earnings, count level, get Persons with certain level, get all children, get all downline.
II. Analisa Masalah
Tugas 1 :
Method :
1. Operasi insert,
Masukan :
informasi yang diberikan adalah informasi dari Person dan parent dari Person yang
terdiri dari nama, jenis kelamin, tanggal lahir, dan total penjualan yang dilakukan (sales
value).
Keluaran :
Sebuah String tanda berhasil.
2. Operasi GetInfo,
Masukan :
pencarian dapat dilakukan dengan memasukan informasi mengenai nama Personyang ingin
dicari.
Keluaran :
informasi detail dari Person, informasi tersebut terdiri atas nama, tanggal lahir, jenis
kelamin, level, gaji, jumlah child, jumlah
3. Operasi getAllChildren,
Masukan :
peritah untuk menampilkan semua child dari seorang Person.
Keluaran :
list nama dari Person yang merupakan child dari nama orang yang dimasukan tersebut.
Jika tidak ada seorangpun yang menjadi child dari nama yang dimasukan tersebut maka
balikan dari pertanyaan tersebut adalah NOBODY.Jika informasi orang yang dicari tidak
valid maka yang akan di cetak adalah string INVALID PERSON.
4. Operasi getAllDownline,
Masukan :
perintah untuk menampilkan semua downline dari seorang person.
Keluaran :
list nama dari Person yang merupakan child dari nama orang yang dimasukan tersebut.
Jika tidak ada seorangpun yang menjadi child dari nama yang dimasukan tersebut maka
balikan dari pertanyaan tersebut adalah NOBODY.Jika informasi orang yang dicari tidak
valid maka yang akan di cetak adalah string INVALID PERSON. Keluaran dari informasi
getAllDownline ini adalah list nama dari Person yang merupakan downline dari nama
orang yang dimasukan tersebut. Jika tidak ada seorangpun yang menjadi downline dari
nama yang dimasukan tersebut maka balikan dari pertanyaan tersebut adalah
NOBODY.Jika informasi orang yang dicari tidak valid maka yang akan di cetak adalah string
INVALID PERSON.
5. Operasi personWithLevel,
Masukan :
perintah untuk menampilkan semua orang yang berada pada suatu level
Keluaran :
Keluaran dari informasi GET PERSON LEVEL ini adalah list nama dari Person yang
berada pada level tersebut.Jika tidak ada seseorangpun yang berada pada suatu level
yang ditanyakan maka balikan dari pertanyaan tersebut adalah NOBODY.Jika
informasi orang yang dicari tidak valid maka yang akan di cetak adalah string
INVALID PERSON.
6. Operasi countLevel,
Masukan :
proses penghitungan level dari suatu Person, level dipengaruhi oleh pendapatan (sales)
dan banyak downline yang dimiliki oleh seorang Person
Keluaran :
Keluaran dari informasi countLevel ini adalah level dari Person, informasi tersebut berisi
level dari orang yang dimasukkan namanya. Jika informasi orang yang dimasukkan
tidak valid maka yang akan di cetak adalah string INVALID PERSON.
7. Operasi countEarning,
Masukan :
proses penghitungan salary dari seorang Person, salary atau gaji dipengaruhi oleh level
dan total gaji anak yang dimiliki oleh seorang Person.
Rumus dari salary adalah : SALARY = LEVEL x 1000000 + TOTAL CHILD SALARY x 10%
Keluaran :
Keluaran dari informasi COUNT SALARY ini adalah gaji dari Person, informasi tersebut berisi
gaji dari orang yang dimasukkan namanya. Jika informasi orang yang dimasukkan tidak valid
maka yang akan di cetak adalah string INVALID PERSON.
8. Operasi Delete,
Masukan :
informasi yang diberikan adalah informasi berupa nama dari Person yang akan dihapus.
Keluaran :
Keluaran dari operasi deleteini adalah OK jika nama Persontersebut valid, atau
DELETE FAILED jika nama Person tersebut tidak valid. BIGBOSS tidak bisa dihapus.
9. Operasi Update,
Masukan :
perasi update, informasi yang dapat di-update adalah jenis kelamin (code: GENDER),
tanggal lahir (code: DAYBIRTH), dan salesvalue yang telah dilakukan (code: SALES).
Keluaran :
Keluaran dari operasi update ini adalah OK jika nama Personyang di-update valid atau
UPDATE FAILED, jika nama Persontersebut tidak valid.
10. Operasi Exit,
perintah untuk keluar dari program.
Ide Pemecahan Masalah & Algoritma
1. Operasi insert,
a) Pada person kita buat sebuat list children yang merupakan kumpulan anak dari suatu
person.
b) Ketika sebuah person yang baru di instasiasi kita akan melakukan pemeriksaan pada list
of tree dengan melakukan recursive dengan memanggil method find untuk mencari
apakah person ini telah berada dalam list jika telah ada maka akan dikembalikan
method error jika belum maka akan dilakukan pemeriksaan apakah belownya atau
parent ada ? Kalau parentnya belum ada maka akan dikembalikan pesan error jika ada
makan person telah dapat diinsert.
c) Setiap person yang diinsert akan dimaksukan kedalam list of person dari setiap
belownya,
d) Ketika dilakukan insert akan dilakukan juga penghitungan setcountearcning dan set level
dari setiap person.
2. Operasi GetInfo,
a. Method ini akan mengembalikan info dari setiap orang yang dimasukan dari program
yang berupa string
3. Operasi getAllChildren,
a. Method ini akan mengembilkan semua person yang merupakan member list of children
dari person tersebut.
b. Ketika user memasukkan sebuah string nama, maka program akan memanggil method
find untuk menemukan apakah person tersebut ada dalam tree.
c. Jika ada maka akan diperiksa apakah list dari person tersebut memiliki anak.
d. Jika iya maka akan menampilkan setiap anak yang berada dalam list tersebut
e. Jika tidak maka akan dikembalikan sebuah string NOBODY.
4. Operasi getAllDownline,
a. Method ini akan mengembalikan setiap keturunan dari suatu person.
b. Ketika user melakukan atau ememasukan sebuah string maka program akan memangil
method find.
c. Jika ada node tersebut atau person tersebut berada dalam sebuah tree maka node
tersebut akan melakukan recursive untuk menampilkan setiap person yang merupakan
keturunannya ataupun keturunan dari anak2xnya.
5. Operasi personWithLevel,
a. Method ini akan menampilkan suatu person pada suatu level tertentu
b. Ketika user memasukkan level suatu person maka program akan melakukan recursive
dari root sampai dengan anak untuk melakukan pencarian setiap person yang memilki
level terentu.
c. Hasilnya akan ditampung didalam list yang akan dikembalikan kepada user
d. Jika list tersebut empty maka tidak ditemukan user dalam list tersebut.
6. Operasi countLevel,
a. Method ini merupakan method yang digunakan untuk melakukan penghitungan level
dari suatu person.proses penghitungan level dari suatu Person, level dipengaruhi
oleh pendapatan (sales) dan banyak downline yang dimiliki oleh seorang Person.
7. Operasi countEarning,
a. Method ini digunakan untuk melakukan penghitungan salary dari setiap seseorang.
b. Proses penghitungan salary dari seorang Person, salary atau gaji dipengaruhi oleh
level dan total gaji anak yang dimiliki oleh seorang Person.
c. Pertama method akan memanggil method getchildren salary method ini dignukan untuk
mengdapatakan jumlah salary dari setiap anak setelah itu akan dilakukan penghitungan
dibawah ini.
d. SALARY = LEVEL x 1000000 + TOTAL CHILD SALARY x 10%
e. Method akan mengembalikan nilai pendapatan suatu person.
8. Operasi Delete,
a. Method ini digunakan untuk menghapus suatu person dari sebuah tree.
b. Ketika person akan dihapus maka akan diperiksa apakah person tersebut memiliki anak.
Jika memiliki anak maka person tersebut akan menambahkan setiap anak person
tersebut pada parentnya.
c. Jika telah selesai maka person tersebut akan dihapus dari parentnya
d. Jika person tersebut tidak memiliki anak maka person tersebut dapat langsung dihapus
dari parentnya.
e. Ketika melakukan delete maka pendapatan maupun level yang berhubungan dengan
person tersebut akan diupdate.
9. Operasi Update,
a. Method yang digunakan untuk melakukan update pada setiap person.
10. \Operasi Exit,
a. perintah untuk keluar dari program.
Progam Sumber
import java.awt.List;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Scanner;
import javax.print.attribute.standard.Finishings;
import javax.xml.bind.ParseConversionEvent;
/**
* SDA11112
*
* - 1.0 (19-11-2011): implement all of method.
*
* Copyright 2011 Canggih Pramono Gultom (1006826295).
*/
/**
Class SDA11112 merupakan class utama dalam program ini
*/
public class SDA1112 {
/**
* @param args
*/
@SuppressWarnings("deprecation")
public static void main(String[] args) {
// TODO Auto-generated method stub
// instansiasi root sebagai bigboss dari suatu Tree
Person boss = new Person("BigBoss", "","",0);
MLMnode root = new MLMnode(boss);
MLMTree tree = new MLMTree();
tree.setRoot(root);
// melakukan pembacaan masukan dari system of file
Scanner input = new Scanner (System.in);
String masukan = "";
System.out.print("Command > ");
// melakukan looping untuk menerima perintah
while(input.hasNextLine()){
masukan = input.nextLine();
if(masukan.equalsIgnoreCase("exit")){
break;
}else{
// melakukan pemecahan string yang dipisahkan oleh tanda spasi
String[] arrayofPerson = masukan.split(" ");
//method insert to tree
if(arrayofPerson[0].equalsIgnoreCase("INSERT")){
Person newPerson = new Person(arrayofPerson[1],arrayofPerson[2],
arrayofPerson[3], Integer.parseInt(arrayofPerson[4]));
tree.insertChild(newPerson, arrayofPerson[6]);
}
//method getinfo
else if(arrayofPerson[0].equalsIgnoreCase("GET") && arrayofPerson.length == 2){
tree.getInfo(arrayofPerson[1]);
}
//method get children from person
else if(arrayofPerson[0].equalsIgnoreCase("GET") && arrayofPerson[1].equalsIgnoreCase("CHILDREN")&& arrayofPerson.length == 3){tree.getAllChildren(arrayofPerson[2]); }
//method get downline from personelse if(arrayofPerson[0].equalsIgnoreCase("GET") && arrayofPerson[1].equalsIgnoreCase("DOWNLINE")&& arrayofPerson.length == 3){tree.getAllDownline(arrayofPerson[2]);}
//method get person with certain level
else if(arrayofPerson[0].equalsIgnoreCase("GET") && arrayofPerson[1].equalsIgnoreCase("PERSON")&& arrayofPerson.length == 4){tree.getPersonWithLevel(Integer.parseInt(arrayofPerson[3]));
}
//method to count level from certain person
else if(arrayofPerson[0].equalsIgnoreCase("COUNT") && arrayofPerson[1].equalsIgnoreCase("LEVEL")&& arrayofPerson.length == 3){
if(tree.contains(arrayofPerson[2])){
System.out.println(arrayofPerson[2]+" LEVEL "+tree.countLevel(arrayofPerson[2]))}else{
System.out.println("INVALID PERSON '" +arrayofPerson[2]+"'");
}
}
//method to get salary of someone
else if(arrayofPerson[0].equalsIgnoreCase("COUNT") && arrayofPerson[1].equalsIgnoreCase("SALARY")&& arrayofPerson.length == 3){if(tree.contains(arrayofPerson[2])){ System.out.println(arrayofPerson[2]+" SALARY "+tree.countEarnings(arrayofPerson[2]));
}else{
System.out.println("INVALID PERSON '" +arrayofPerson[2]+"'");
}
}
//method insert to update
else if(arrayofPerson[0].equalsIgnoreCase("UPDATE")){
String gender="";
String dayBirth="";
int sales=0;
for(int i=0; i < arrayofPerson.length;i++){
if(arrayofPerson[i].equalsIgnoreCase("GENDER")){
gender = arrayofPerson[i+1];
}
if(arrayofPerson[i].equalsIgnoreCase("SALES")){
sales = Integer.parseInt(arrayofPerson[i+1]);
}
if(arrayofPerson[i].equalsIgnoreCase("DAYBIRTH")){
dayBirth = arrayofPerson[i+1];
}
}
tree.update(arrayofPerson[1], gender, dayBirth, sales);
//method to delete someperson from tree
}else if(arrayofPerson[0].equalsIgnoreCase("DELETE")){
tree.delete(arrayofPerson[1]);
}
}
System.out.print("Command > ");
}
}
}
/**
* Class Person merupakan class representasi dari objek Person Class ini
* memiliki field berupa nama, jenis kelamin, tanggal lahir, total penjualan,
* gaji dan marketing level. berturut-turut masing-masing field tersebut
* menandakan informasi mengenai pengirim dari email, subject dari email, dan
* waktu dari email
*/
class Person {
private String nama;
private String kelamin;
private String lahir;
private int sValue;
private int gaji;
private int mLevel;
/**
* @param nama
* @param kelamin
* @param lahir
* @param sValue
* @param gaji
* @param mLevel
*/
public Person(String nama, String kelamin, String lahir, int sValue) {
this.nama = nama;
this.kelamin = kelamin;
this.lahir = lahir;
this.sValue = sValue;
}
public String getNama() {
return nama;
}
public void setNama(String nama) {
this.nama = nama;
}
public String getKelamin() {
return kelamin;
}
public void setKelamin(String kelamin) {
this.kelamin = kelamin;
}
public String getLahir() {
return lahir;
}
public void setLahir(String lahir) {
this.lahir = lahir;
}
public int getsValue() {
return sValue;
}
public void setsValue(int sValue) {
this.sValue = sValue;
}
public int getGaji() {
return gaji;
}
public void setGaji(int gaji) {
this.gaji = gaji;
}
public int getmLevel() {
return mLevel;
}
public void setmLevel(int mLevel) {
this.mLevel = mLevel;
}
@Override
public String toString() {
return "Person [nama=" + nama + ", kelamin=" + kelamin + ", lahir="
+ lahir + ", sValue=" + sValue + ", gaji=" + gaji + ", mLevel=" + mLevel + "]";
}
}
/**
* Class MLMTree merupakan class mereprentasikan
* tree dari organisasi MLM setiap person
* yang berada dalam perusahaan terdapat field root yang merupakan boos dari MLM
*/
class MLMTree {
MLMnode BigBoss;
/**
* @param bigBoss
*/
public MLMTree() {
BigBoss = null;
}
public MLMTree(MLMnode node){
BigBoss = node;
}
/**
* Method untuk menset nilai dari suatu root
* */
public void setRoot(MLMnode node){
BigBoss = node;
}
/**
* Method mengembalikan root element
* */
public MLMnode getRootElement(){
return BigBoss;
}
/**
* Method untuk memeriksa setiap person apakah berada dalam tree
* @return mengembalikan nilai boolean jika person ditemukan
* @return true jika ditemukan
* @return false jika tidak ditemukan
* */
public boolean contains(String personName) {
return (find(personName) != null);
}
public MLMnode find(String personName) {
MLMnode returnNode = null;
if(this.BigBoss != null) {
returnNode = _find(BigBoss, personName);
}
return returnNode;
}
/**
* Method _find - method yang digunakan untuk mencari suatu node didalam tree
* @return mengembalikan node yang telah didapatkan
*/
private MLMnode _find(MLMnode currentNode, String personName) {
MLMnode returnNode = null;
if (currentNode.getData().getNama().equalsIgnoreCase(personName)) {
returnNode = currentNode;
}
else if(currentNode.hasChildren()) {
int i = 0;
while(returnNode == null && i < currentNode.numberOfChildren()) {
returnNode = _find(currentNode.getChildAt(i), personName);
i++;
}
}
return returnNode;
}
/**
* Method inserChild - method yang digunakan untuk menambahkan anak pada sebuah Tree
*/
public void insertChild(Person newPerson, String parent){
if(contains(newPerson.getNama()) == false && contains(parent) == true){
MLMnode parental = find(parent);
MLMnode children = new MLMnode(newPerson);
parental.addChild(children);
children.setParent(parental);
setPersonLevel(this.BigBoss);
setPersonEarnings(parental);
System.out.println("OK");
}
else if(contains(newPerson.getNama()) == true){
System.out.println("INSERT FAILED. Nama '"+ newPerson.getNama()+"' ALREADY EXIST");
}
else if (contains(parent) == false){
System.out.println("INSERT FAILED INVALID PERSON '" +parent+"'");
}
}
/**
* Method getInfo - method yang digunakan untuk mendapatkan info dari sebuah Tree
*/
public void getInfo(String nama){
if(contains(nama)){
MLMnode returnNode = null;
returnNode = find(nama);
System.out.println(returnNode.getData().getNama());
System.out.println("DAYBIRTH "+returnNode.getData().getLahir());
System.out.println("Gender "+returnNode.getData().getKelamin());
System.out.println("Level "+returnNode.getData().getmLevel());
System.out.println("Sales "+returnNode.getData().getsValue());
System.out.println("Salary "+countEarnings(returnNode.getData().getNama()));
System.out.println("Total Child "+returnNode.numberOfChildren());
System.out.println("Total Downline "+countDownline(returnNode.getData().getNama()));
}else{
System.out.println("INVALID PERSON '"+nama+"'");
}
}
/**
* Method getAllChildren - method yang digunakan untuk menampilkan anak dari dari setiap induk
*/
public void getAllChildren(String nama){
if(contains(nama)){
MLMnode returnNode = null;
returnNode = find(nama);
if(returnNode.hasChildren()) {
int i = 0;
while(i < returnNode.numberOfChildren()) {
System.out.print(returnNode.getChildAt(i).getData().getNama()+",");
i++;
}
System.out.println("");
}
else{
System.out.println("NOBODY");
}
}else{
System.out.println("INVALID PERSON '"+nama+"'");
}
}
/**
* Method getPersonWithLevel - method yang digunakan menampilkan person sesuai dengan level tertentu
*/
public void getPersonWithLevel(int mLevel){
ArrayList returnNodes=null;
MLMnode returnNode = null;
returnNode = BigBoss;
returnNodes =_getPersonWithLevel(returnNode, mLevel);
if(returnNodes.isEmpty()){
System.out.println("NOBODY");
}else{
for (MLMnode mlMnode : returnNodes) {
System.out.print(mlMnode.getData().getNama()+",");
}
System.out.println("");
}
}
/**
* Method _getPersonWithLevel - method yang digunakan mengembalikan person sesuai dengan level tertentu
* @return akan mengembalikan list suatu person pada level tertentu
*/
public ArrayList _getPersonWithLevel(MLMnode returnNode,int mLevel){
ArrayList nodes = new ArrayList();
ArrayList nodesanak = new ArrayList();
if(returnNode.hasChildren()){
for(int i=0; i < returnNode.numberOfChildren();i++){
if(returnNode.getChildAt(i).getData().getmLevel() == mLevel){
/*System.out.print(returnNode.getChildAt(i).getData().getNama()+",");*/
nodes.add(returnNode.getChildAt(i));
}
if(returnNode.getChildAt(i).hasChildren()){
nodesanak = _getPersonWithLevel(returnNode.getChildAt(i), mLevel);
}
}
}
for (MLMnode mlMnode : nodesanak) {
nodes.add(mlMnode);
}
return nodes;
}
/**
* Method setPersonLevel - method yang digunakan menset level dari setiap person sesuai* dengan kembalian dari perhitungan pada countlevel method ini digunakan ketika insert,update maupun delete
*/
public void setPersonLevel(MLMnode node){
MLMnode returnNode = null;
returnNode = node;
if(returnNode.hasChildren()){
for(int i=0; i < returnNode.numberOfChildren();i++){ returnNode.getChildAt(i).getData().setmLevel(countLevel(returnNode.getChildAt(i).getData().getNama())); if(returnNode.getChildAt(i).hasChildren()){ setPersonLevel(returnNode.getChildAt(i));
}
}
}
}
/**
* Method countLevel - method yang digunakan untuk menghitung setiap level dari setiap person
* @return level dari setiap person;
* @return 1 base case
* @return 2 ketika value >= 100000 && downline < 10
* @return 3 ketika value >= 1000000 &7 downline < 20
* dst....
*/
public int countLevel(String nama){
int mLevel = 1;
if(contains(nama)){
MLMnode node = null;
node = find(nama);
if(node.getData().getsValue() >= 0 && countDownline(nama) < 5){
mLevel = 1;
}
else if(node.getData().getsValue() >= 100000 && countDownline(nama) < 10){
mLevel = 2;
}
else if(node.getData().getsValue() >= 1000000 && countDownline(nama) < 20){
mLevel = 3;
}
else if(node.getData().getsValue() >= 3000000 && countDownline(nama) < 40){
mLevel = 4;
}
else if(node.getData().getsValue() >= 5000000 && countDownline(nama) < 100){
mLevel = 5;
}
else if(node.getData().getsValue() >= 6000000 && countDownline(nama) < 150){
mLevel = 6;
}
else if(node.getData().getsValue() >= 10000000 && countDownline(nama) < 200){
mLevel = 7;
}
else if(node.getData().getsValue() >= 20000000 && countDownline(nama) < 250){
mLevel = 8;
}
else if(node.getData().getsValue() >= 40000000 &&countDownline(nama) < 500){
mLevel = 9;
}
else if(node.getData().getsValue() >= 50000000 && countDownline(nama) > 500){
mLevel = 10;
}
}
return mLevel;
}
/**
* Method delete - method yang digunakan untuk menghapus setiap person
* @algoritma
* ketika seorang person memiliki anak maka anak tersebut akan menjadi parent dari induknya
* ketika person tidak memiliki anak maka si anak akan langsung dihapus
*/
public void delete(String nama){
if(nama.equalsIgnoreCase(this.BigBoss.getData().getNama())){
System.out.println("DELETE FAILED. BIGBOSS CANNOT BE DELETED");
}else{
if(contains(nama)){
MLMnode deleteNode = find(nama);
MLMnode parentNode = deleteNode.getParent();
if(deleteNode.hasChildren()){
for(int i=0;i < deleteNode.numberOfChildren();i++){
parentNode.addChild(deleteNode.getChildAt(i));
}
for(int i=0; i < parentNode.numberOfChildren();i++){
if(parentNode.getChildAt(i).getData().getNama().equalsIgnoreCase(deleteNode.getData().getNama())){
parentNode.removeChildAt(i);
}
}
setPersonLevel(this.BigBoss);
setPersonEarnings(parentNode);
System.out.println("OK");
}else{
for(int i=0; i < parentNode.numberOfChildren();i++){
if(parentNode.getChildAt(i).getData().getNama().equalsIgnoreCase(deleteNode.getData().getNama())){
parentNode.removeChildAt(i);
}
}
System.out.println("OK");
setPersonLevel(this.BigBoss);
setPersonEarnings(parentNode);
}
}else{
System.out.println("INVALID PERSON '"+nama+"'");
}
}
};
/**
* Method update - method yang digunakan untuk mengupdate nama dan daybirth dan sales
* dari setiap person
*/
public void update(String nama, String gender, String dayBirth, int sales){
if(contains(nama)){
MLMnode updatedNode = find(nama);
if(!gender.equalsIgnoreCase("")){
updatedNode.getData().setKelamin(gender);
}
if(!dayBirth.equalsIgnoreCase("")){
updatedNode.getData().setLahir(dayBirth);
}
if(sales > 0){
updatedNode.getData().setsValue(sales);
setPersonLevel(this.BigBoss);
setPersonEarnings(this.BigBoss);
}
System.out.println("OK");
}else{
System.out.println("INVALID PERSON '"+nama+"'");
}
};
/**
* Method countEarnings - method yang digunakan untuk mendapatkan jumlah gaji dari setiap orang
* @return jumlah gaji setiap orang
*/
public int countEarnings(String nama){
int gaji = 0;
if(contains(nama)){
MLMnode node = null;node = find(nama);
gaji = ((node.getData().getmLevel() * 1000000) + (getAllDownlineSalary(nama) * 10/100));
}
return gaji;
}
/**
* Method setPersonEarnings - method yang digunakan untuk menset jumlah pendapatan* dari setiap person dalam suatu downline ketia suatu person di insert dalam tree*/
public void setPersonEarnings(MLMnode node){
MLMnode returnNode = null;
returnNode = node;
if(returnNode.hasChildren()){
for(int i=0; i < returnNode.numberOfChildren();i++){ returnNode.getChildAt(i).getData().setGaji(countEarnings(returnNode.getChildAt(i).getData().getNama())); if(returnNode.getChildAt(i).hasChildren()){ setPersonEarnings(returnNode.getChildAt(i));
}
}
}
}
/**
* Method getAllDownline - method yang untuk mencetak
* setiap downline dari suatu person.
* @return tampilan setiap downline pada layar
*/
public void getAllDownline(String nama){
if(contains(nama)){
MLMnode returnNode = null;
returnNode = find(nama);
if(returnNode.hasChildren()){
for(int i=0; i < returnNode.numberOfChildren();i++){
System.out.print(returnNode.getChildAt(i).getData().getNama()+",");
if(returnNode.getChildAt(i).hasChildren()){
getAllDownline(returnNode.getChildAt(i).getData().getNama());
}
}
System.out.println("");
}else{
System.out.println("NOBODY");
}
}else{
System.out.println("INVALID PERSON '"+nama+"'");
}
}
/**
* Method getAllDownlineSalary - method yang digunakan untuk mendapatkan gaji dari
* setiap downline seorang person.
* @return jumlah total salary dari kumpulan downline
*/
public int getAllDownlineSalary(String nama){
int gaji = 0;
if(contains(nama)){
MLMnode returnNode = null;
returnNode = find(nama);
if(returnNode.hasChildren()){
for(int i=0; i < returnNode.numberOfChildren();i++){
gaji = gaji + countEarnings(returnNode.getChildAt(i).getData().getNama());
}
}else{
gaji = 0;
}
}
return gaji;
}
/**
* Method countDownline - method yang untuk menghitung jumlah jumlah downline
* dari suatu person.
* @return jumlah anak dari suatu person.
*/
public int countDownline(String nama){
int counter = 0;
if(contains(nama)){
MLMnode returnNode = null;
returnNode = find(nama);
if(returnNode.hasChildren()){
for(int i=0; i < returnNode.numberOfChildren();i++){
counter = counter + 1;
if(returnNode.getChildAt(i).hasChildren()){
counter = counter + countDownline(returnNode.getChildAt(i).getData().getNama());
}
}
}
}
return counter;
}
}
/**
Class MLMnode merupakan class yang merepresentasikan node (MLMnode)Class ini memiliki list dari setiap node yang disimpan dalam children dan sebuah element yaitu person yang merupakan induk dari children dan juga sebuah node yang merupakan induk dari element.
*/
class MLMnode{
MLMnode parent;
Person element;
ArrayList children;
public MLMnode(Person value){
children = new ArrayList();
element= value;
parent = null;
}
/* Method - method set dan getter yang terdapat pada MLMnode*/
// method untuk set data seorang person
public void setData(Person person){
element = person;
}
// method untuk mengembalikan data seorang person
public Person getData() {
return element;
}
// method untuk set data seorang parent dari person
public void setParent(MLMnode node){
parent = node;
}
// method untuk mengembalikan data dari parent
public MLMnode getParent() {
return parent;
}
// method untuk mengembalikan jumlah anak dari suatu person
public int numberOfChildren(){
return this.children.size();
}
// method untuk mengembalikan apakah memiliki anak atau tidak
public boolean hasChildren(){
return numberOfChildren() != 0;
}
// method untuk menambahkan anak dari seorang person
public void addChild(MLMnode child){
children.add(child);
}
// method untuk menghapus semua anak dari seorang person
public void removeChildren() {
this.children = new ArrayList();
}
// method untuk melakukan insert data kedalam suatu node
public void insert (Person data){
addChild(new MLMnode(data));
}
// method untuk menambahkand data dari suatu person kepada urutan tertentu
public void addChildAt(int index,MLMnode child){
this.children.add(child);
}
// untuk menambhakn suatu nakan pada akan dari suatu node pada urutan tertentu
public void insertAt(int index, MLMnode child){
addChildAt(index, child);
}
// method untuk mengembalikan node dari suatu anak
public MLMnode getChildAt(int index) {
return this.children.get(index);
}
// method untuk menghapus anak dari list
public void removeChildAt(int index) {
this.children.remove(index);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
MLMnode other = (MLMnode) obj;
if (element == null) {
if (other.element != null) {
return false;
}
} else if (!element.equals(other.element)) {
return false;
}
return true;
}
}
Top Related