2016-11-08 5 views
-1

Я новичок в попытках и тестировании того, как это работает. Сейчас я создаю список контактов. Я добавляю «Prashanth» и «Pradep» к trie, и когда я ищу «Pra», я должен получить счет как два. Мой подход имеет переменную размер в каждом узле и возвращает его, когда найденная строка одинаковой длины. Есть некоторые ненужные вещи/переменные, такие как полезная нагрузка и т. Д., Которые я использовал для отладки. Проблема, которую я обнаружил, - это когда я храню символ и узел в hashmap, пустые узлы хранятся. Поэтому я получаю 0 в качестве ответа все время.Java Tries: нужен лучший подход

public class tries { 

public static class Node { 

    HashMap<Character, Node> children = new HashMap<>(); 
    boolean endOfWord = false; 
    int size =0; 
    int payload = 10; 


    public void setNode(char c, Node n) { 
     children.put(c,n); 
    } 

    public Node getNode(char c) { 
     return children.get(c); 
    } 

    public void addNode(String s,int index) { 
     Node current = children.get(s.charAt(index)); 
     size++; 
     if(index ==s.length()-1) 
     { 
      endOfWord = true; 
      return; 
     } 
     if(current== null) 

     { 
      current.payload = 11; 
      this.setNode(s.charAt(index),current); 
     } 
     addNode(s,index+1); 

    } 

    public int findcount(String s, int index) { 
     Node current = children.get(s.charAt(index)); 

     if(index ==s.length()-1) 
     { 
      current.endOfWord = true; 
      return current.size; 
     } 
     if(current == null) 
     { 
      return 0; 
     } 


     return findcount(s,index+1); 
    } 
} 
public static void main(String args[]) 
{ 
    String c1 = "Prashanth"; 
    String c2= "Pradep"; 
    Node n = new Node(); 
    //tries t = new tries(); 

    n.addNode(c1,0); 
    n.addNode(c2,0); 

    System.out.println(n.findcount("Pra",0)); 


} 

}

Ошибка, который я получаю Если я запускаю этот код. (Я получу 0, если я изменить немного)

Exception in thread "main" java.lang.NullPointerException 
at tries$Node.addNode(tries.java:35) 
at tries.main(tries.java:66) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
+7

Так , вы получаете исключение NullPointerException или нет? Если да, то опубликуйте его трассировку стека; если нет, измените название вашего вопроса. –

+1

Проблема в 'addNode', строка' this.setNode (s.charAt (index), current); 'сначала ток будет * пустым узлом *, и вы устанавливаете это в хэш-символе' children'. –

+0

Вы пытаетесь найти контакт? И нормально ли это делать по-другому? – triForce420

ответ

0

Вы можете сделать что-то вроде этого:

import java.util.HashMap; 
import java.util.Map; 


public class ContactList { 

    Map<String, String> contactList; 

    public ContactList() { 
     //initialize the map of contact lists. 
     contactList = new HashMap<String, String>(); 
    } 

    public void addContact(String name, String number){ 
     contactList.put(name, number); 
    } 

    public Map<String,String> findbyName(String name){ 

     Map<String,String> resultMap = new HashMap<String, String>(); 

     for(String key : contactList.keySet()){ 
      //trim and make the name lowercase, then compare it to the lowercased String 
      if(key.trim().toLowerCase().contains(name.toLowerCase())){ 
       resultMap.put(key, contactList.get(key)); 
      } 
     } 
     return resultMap; 

    } 

    public int countResult(String name){ 
     //return size of found map 
     return findbyName(name).size(); 
    } 



} 

затем использовать его на основной метод:

public class ContactMain { 

    public static void main(String args[]) 
    { 
     String c1 = "Prashanth"; 
     String c2= "Pradep"; 
     ContactList contacts = new ContactList(); 
     contacts.addContact(c1, "1234567890"); 
     contacts.addContact(c2, "12345678"); 
     System.out.println(contacts.countResult("Pra")); 

    } 
} 
+0

Спасибо. Этот код работает, но я начал эту проблему, чтобы изучить попытки. Можете ли вы помочь мне с этим подходом? –

0

Вы проверить если current является нулевым, а затем, если это так, вы вызываете что-то на нем. Смотрите этот блок:

if(current== null) 
    { 
     current.payload = 11; 
     this.setNode(s.charAt(index),current); 
    } 

Обратите внимание на current == null, а затем current.payload. Вы ничего не можете позвонить на null, это представление ничего :)

То, что вы, вероятно, хотите сделать, это создать новый Node, инициализировать его, поместите его в карту, а затем присвоить его current