2017-05-20 12 views
1

Ich habe ein kleines Problem mit zwei verschiedenen Klassen und zwei Methoden aus der gleichen Klasse. Ich habe eine Klasse B, die beide Methoden aus Klasse A verwendet, die gut zu funktionieren scheint. Das Problem ist jedoch, dass die erste Methode aus der Klasse a (insert) eine Liste ändert, die die zweite Methode (lookup) aus dieser Klasse verwenden soll. Es verwendet die globale Liste, die immer noch nur mit Nullen eingeleitet wird. Also habe ich keine Ahnung, wie ich die HashMap-Methode von der Insert-Methode aus verwenden soll:/Ich hoffe, dass jemand helfen kann, danke!Python - Zugriff auf eine Liste von einer anderen Klassenmethode

""" PUBLIC MEMBERS 

Insert the given key (given as a string) with the given value (given as 
an integer). If the hash table already contains an entry for the given key, 
update the value of this entry with the given value. 
""" 

class Map: 
    global m 
    m = 10000 
    global HashMap 
    HashMap = [] 
    for i in range(m): 
     HashMap.append(0) 

    @classmethod 
    def insert(self, key, value): 

     """ 
     >>> Map.insert("hi", 9) 
     [4,53] 
     """ 
     self.key = key 
     self.value = value 


     asci = 0 
     for i in key: 
      asci += ord(i) 
     hashindex = (asci%m)*2 
     print(hashindex) 
     print(HashMap[hashindex]) 

     if HashMap[hashindex] == key: 
      HashMap[hashindex + 1] = value 

     else: 
      while HashMap[hashindex] != 0: 
       hashindex = ((asci+1)%m)*2 


      HashMap[hashindex] = key 
      HashMap[hashindex+1] = value 



    """ Check if there exists an entry with the given key in the hash table. 
    If such an entry exists, return its associated integer value. 
    Otherwise return -1. 
    """ 

    @classmethod 
    def lookup(self, key): 

     self.key = key 
     ascilookup = 0 
     for i in key: 
      ascilookup += ord(i) 

     indexlookup = (ascilookup%m)*2 


     for j in HashMap: 
      if HashMap[j]==key: 
       return HashMap[j + 1] 

      elif HashMap[j]==0: 
       return "-1" 

      else: 
       j =((j+1)%m)*2   



if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 
+0

Warum Sie verwenden eine Liste, um eine Hashmap zu ersetzen? Verwende ein [dictionary] (https://learnpythontehardway.org/book/ex39.html) – pointerless

Antwort

0

Dies ist eine viel einfachere Implementierung einer Karte in Python:

class Map: 
    HashMap = {} 

    def __init__(self,leng): 
     for i in range(leng): 
      self.HashMap[str(i)]=0 

    def insert(self, key, value): 
     self.HashMap[key]=value 


    def lookup(self, key): 
     for each in self.HashMap.iterkeys(): 
      if each == key: 
       return self.HashMap[each] 
     return None 

EDIT ohne ein Wörterbuch mit zwei Listen verwendet, ist einfacher:

class Map: 
    keys = [] 
    values = [] 

    def __init__(self,leng): 
     for i in range(leng): 
      self.keys.append(str(i)) 
      self.values.append(0) 

    @classmethod 
    def insert(self, key, value): 
     self.keys.append(key) 
     self.values.append(value) 

    @classmethod 
    def lookup(self, key): 
     for x in range(0, len(self.keys)): 
      if self.keys[x] == key: 
       return self.values[x] 
     return None 
+0

danke, das Problem ist, ich darf das interne Wörterbuch nicht benutzen:/ – Kuroskai

+0

Ahhh, das erklärt es. Vielleicht 2 Listen verwenden? – pointerless

+0

Ich habe eine zweite Lösung ohne ein Wörterbuch hinzugefügt – pointerless

Verwandte Themen