Avatar billede rasmuslh Nybegynder
27. juli 2006 - 13:18 Der er 2 kommentarer og
1 løsning

Hashtable tilføjelse af noder

Hejsa

Jeg har et problem med et projekt der efterhånden er ved at drive mig til vanvid.

Hvis man forestiller sig en cirkel fra {0 -> n} hvor jeg gerne vil indsætte nogle objekter af en typen Node. En node indsættes på den plads i cirklen der svarer til dens værdi for feltet SHA.

Node har fire felter.

private String ip;
private int SHA;
private Node successor;
private Node predecessor;

public Node(String ip, int SHA) {
    this.ip = ip;
    this.SHA = SHA;
}

En nodes Successor er den node på cirklen der har den nærmeste større SHA-værdi. Dog med den undtagelse at Noden med den højeste SHA-værdi har Noden med den laveste SHA-værdi som successor. På den måde bliver det jo en cirkel.

Jeg tilføjer noderne løbende i en Hashtable hvor jeg gerne vil instantiere en nodes Successor når den indsættes. Indsættelse vil jo også få indflydelse på en anden node der nu skal have ny successor. Metoden findSuccessor bruges til at løbende Hashtablen igennem indtil der findes en successor.

BootStrapPeer er en startpeer der bruges hver gang som udgangspunkt.

Jeg har følgende klasse Network der skal simulere indsættelse af noder:

public class Network {
 
    private static Node bootStrapPeer = null;
    private static Hashtable<Integer, Node> peers = new Hashtable<Integer, Node>();
   
    private static int counter = 0; // bruges til indsættelse i Hashtable
   
    public static Hashtable<Integer, Node> getHashtable() {
      return peers;
    }
   
             
    public static void addBootStrapPeer(Node n) {
      bootStrapPeer = n;
      addPeer(n);
    }
   
    public static Node getBootStrapPeer() {
      return bootStrapPeer;
    }
   
    public static void addPeer(Node n) {
      peers.put((Integer)counter, n);
      counter ++;
    }
   
    public static void findSuccessor(Node contextNode, Node currentNode) {
        Node context = contextNode;
        Node current = currentNode;
        Node currentSuccessor = current.getSuccessor();
       
        // Bruges til at binde nettet sammen når bootStrapPeer og den første node joines
        if(bootStrapPeer.getSuccessor() == null) {
            context.setSuccessor(bootStrapPeer);
            bootStrapPeer.setSuccessor(context);
        }
       
        // hvis currentNode er mindre end context og context er mindre currents successor.
        else if((current.getSHA() < context.getSHA()) && (context.getSHA() < currentSuccessor.getSHA())) {
                context.setSuccessor(currentSuccessor);
                current.setSuccessor(context);
        }
       
        // hvis current node er noden med højeste SHA
        else if(current.getSHA() > currentSuccessor.getSHA()) {
           
            if(context.getSHA() > currentSuccessor.getSHA() && current.getSuccessor().getSuccessor().getSHA() > context.getSHA()) {
                context.setSuccessor(currentSuccessor.getSuccessor());
                currentSuccessor.setSuccessor(context);               
            }
           
            // fanger også muligheden hvor context er større end current node
            else{
                context.setSuccessor(currentSuccessor);
                current.setSuccessor(context);
            }
           
        }
       
        else{
            //System.out.println("Loop");
            Network.findSuccessor(context, currentSuccessor);
        }

    }
           
}


Men når jeg indsætter noderne går der et eller andet galt. Successorne bliver ved et specielt tilfælde corrupted og dermed alt andet end korrekte. Jeg har prøvet at debugge, men jeg har ikke et program hvor man kan læse variablerne løbende og jeg vil nødigt til at skifte software alene af den årsag.

Min main-metode ser således ud:

import java.util.*;


public class NodeTest {
       

    public static void main(String[] args){

          IpConstructor ipc = new IpConstructor(); // laver nyt Ip-Constructor objekt
        IpHash iph = new IpHash(); // laver nyt Ip-Hash objekt
       
        String ip = ipc.generateIP();
        int sha = iph.hashIP(ip);
       
       
        Node bootStrapPeer = new Node("Boot", iph.hashIP(ip)); // laver bootstrap Node
        bootStrapPeer.create(); // danner Chord-ring succcessor = this
        Network.addBootStrapPeer(bootStrapPeer);         


        NodeTest test = new NodeTest();
        test.buildNet(20);
        test.printNet();


    } // main

       
      private void buildNet(int numberOfNodes) {
         
          IpConstructor ipc = new IpConstructor(); // laver nyt Ip-Constructor objekt
        IpHash iph = new IpHash(); // laver nyt Ip-Hash objekt
       
        String ip = ipc.generateIP();
        int sha = iph.hashIP(ip);
         
          for (int k = 0 ; k < numberOfNodes ; k++) {
           
            String name = "Node" + k;
              Node current = new Node(name, iph.hashIP(ip));
            Network.addPeer(current);
              current.join(Network.getBootStrapPeer());
        }
      }

      private void printNet() {
                   
          for (int k = 0 ; k < Network.getHashtable().size() ; k++) {
           
            if(k == 0) {
                System.out.println("BootStrapPeer " + Network.getHashtable().get((Integer)k).getSHA() + " Successor " +
                Network.getHashtable().get((Integer)k).getSuccessor().getSHA());
            }
            else {
                System.out.println("Node" + k + " " + Network.getHashtable().get((Integer)k).getSHA() + " Successor " +
                Network.getHashtable().get((Integer)k).getSuccessor().getSHA());             
            }
        }
      }
 
}

Node-klassen er her:


public class Node {
   
    private String ip;
    private int SHA;
    private Node successor;
    private Node predecessor;
   
    public Node(String ip, int SHA) {
        this.ip = ip;
        this.SHA = SHA;
    }
       
    public int getSHA() {
        return SHA;
    }
   
    public void setSHA(int SHA) {
        this.SHA = SHA;
    }
   
    public String getIP() {
        return ip;
    }
   
   
    public Node getSuccessor(){
        return successor;
    }
   
    public void setSuccessor(Node successor){
        this.successor = successor;
    } 
   
    public void create(){
        predecessor = null;
        successor = null;
    }
   
   
   
    public void join(Node bootstrap){
       
        this.predecessor = null;       
        Network.findSuccessor(this, bootstrap);
   
    }
   
       
    public static void fixFingers() {}
   

   
}


Jeg håber virkelig meget der er en der kan hjælpe da det forhindrer mig i at komme videre med mit projekt og jeg er allerede super presset tidsmæssigt.

På forhånd mange tak

Rasmus
Avatar billede rasmuslh Nybegynder
27. juli 2006 - 13:19 #1
***************
Node 1:  30 134
Node 2:  134 247
Node 3:  145 30
Node 4:  132 145
Node 5:  28 132
Node 6:  7 28
Node 7:  81 7
Node 8:  18 81
Node 9:  244 18
Node 10:  47 244
Node 11:  41 47
Node 12:  76 41
Node 13:  194 76
Node 14:  192 194
Node 15:  46 87
Node 16:  99 192
Node 17:  87 99
bootstrap:  247 46

Her er et eksempel på en kørsel. Som det kan ses er den helt galt.
Avatar billede rasmuslh Nybegynder
27. juli 2006 - 13:22 #2
***************
Node 1:  101 108
Node 2:  116 209
Node 3:  209 101
bootstrap:  108 116

Her er et eksempel på hvor det går godt.
Avatar billede rasmuslh Nybegynder
27. juli 2006 - 18:03 #3
Jeg har selv løst det
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Sektionschef for materielstamdata i FMI i Ballerup

BEC Financial Technologies

Business analyst (Senior)- Scoutz

Capgemini Danmark A/S

Management Consultant