laporan tugas struktur data algoritma

Upload: onolinus

Post on 14-Oct-2015

73 views

Category:

Documents


0 download

DESCRIPTION

Laporan Struktur Data Algoritma Universitas Indonesia

TRANSCRIPT

  • 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;

    }

    }