【问题标题】:Java Tries : Need a better approach [duplicate]Java尝试:需要更好的方法[重复]
【发布时间】:2016-11-08 08:01:23
【问题描述】:

我不熟悉尝试和测试它的工作原理。现在我正在建立一个联系人列表。我将“Prashanth”和“Pradep”添加到特里,当我搜索“Pra”时,我应该收到两个计数。我的方法是在每个节点中都有变量 size 并在找到相同长度的字符串时返回它。有一些不必要的东西/变量,如有效载荷等,我用于调试。我发现的问题是,当我在 hashmap 中存储一个字符和一个节点时,会存储空节点。所以我一直得到 0 作为答案。

 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)

【问题讨论】:

  • 那么,您是否收到 NullPointerException 异常?如果是,则发布其堆栈跟踪;如果不是,请更改问题的标题。
  • 问题出在 addNode 中,this.setNode(s.charAt(index),current); 的第一个当前行将是 空节点,您将其设置在 children 哈希中。
  • 您要搜索联系人吗?换一种方式可以吗?
  • @SunilBN:我明白了。所以我尝试使用有效负载初始化并添加一些数据。虽然我没有得到它
  • @JBNizet:已发布

标签: java algorithm trie


【解决方案1】:

你可以这样做:

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();
    }



}

然后在 main 方法上使用它:

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"));

    }
}

【讨论】:

  • 谢谢。这段代码有效,但我开始这个问题是为了学习尝试。你能帮我解决这个问题吗?
【解决方案2】:

您检查current 是否为空,如果是,则调用它。看到这个块:

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

注意current == null,然后是current.payload。你不能在null 上调用任何东西,它代表什么都没有:)

您可能想要做的是创建一个新的Node,对其进行初始化,将其放入地图中,然后将其分配给current

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多