java - 将单词存储到 Hashmap 中

标签 java servlets hashmap

我正在尝试解析一个文本文件并将第一个单词存储为 HashMap 的键,并将其余单词存储为其值。我试图做的是创建一种翻译器,用户将在其中输入英语单词(键),然后它将返回值(西类牙语翻译,可能不止一个单词)。这是文本文件的示例(注意:我也不能存储以字符“#”开头的行中的字符串):

###########################################################################
#Copyright 1999 The Internet Dictionary Project/Tyler Chambers
###########################################################################
a   un, uno, una[Article]
aardvark    cerdo hormiguero
aardvark    oso hormiguero[Noun]
aardvarks   cerdos hormigueros
aardvarks   osos hormigueros 
ab  prefijo que indica separacio/n
aback   hacia atrás

更新:我已将代码更新为迄今为止的代码。我非常接近。我遇到的一个问题是处理在西类牙语中有多种翻译的(英语)单词。我遇到的问题是处理这些键和值。当一个单词有多种翻译时我希望发生的情况如下: 输出: 英语: 土豚 西类牙语:1.cerdo hormiguero 2.oso hormiguero[名词]

我遇到的另一个问题是,当用户输入未翻译的单词时,会显示一条消息,指出该单词无法翻译。我用了 if(request.getParameter("inputtext") != null) 检查但不工作。任何帮助,将不胜感激! 包lab1;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/Translate")
public class Translate extends HttpServlet {
private static final long serialVersionUID = 1L;
public static String realPath;
private BufferedReader reader;
public HashMap<String, String> lists = new HashMap<String, String>();

public Translate() {
    super();
    // TODO Auto-generated constructor stub
}

public void init(ServletConfig config) throws ServletException {
        super.init(config);
    realPath = this.getServletContext().getRealPath("/WEB-INF/Spanish.txt");
    File file = new File(realPath);
    try {
        reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "ISO8859-1"));
        String line = null;
        StringBuilder rslt = new StringBuilder();
        if(reader != null){
            while ((line = reader.readLine()) != null) {
                if ((line.length()>0)&&(line.charAt(0) != '#')){
                    String [] tokens = line.split("\\s", 2);
                    if (lists.containsKey(tokens[0])) {
                        //handle the duplicates
                   } else {
                       lists.put(tokens[0].replaceAll("\\s",""), line.substring(tokens[0].length()).trim());
                   }
                }
            }
            Iterator iterator = lists.keySet().iterator();  
            while (iterator.hasNext()) {  
               String key = iterator.next().toString();  
               String value = lists.get(key).toString();  

               //System.out.println("KEY: " + key + " \nVALUE:" + value);  
            }
        }
            //System.out.println(rslt.toString());
    } catch (FileNotFoundException e) {
        System.out.println("Blah1");
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head><title>English to Spanish Translator</title>");
    out.println("<style>h1,h2,form,p{text-align:center;color:white}body{background-color:black;}</style></head>");
    out.println("<body>");
    out.println("<h1>Welcome to the Online Translator</h1>");
    out.println("<h2>Please Enter a Word in English:</h2>");
    out.println("<form method='post'><input id='inputtext' name='inputtext'></inputText><input type='submit' value='Translate' name='submit'></input></form>");
    out.println("</body></html>");
    out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    String value = (String) lists.get(request.getParameter("inputtext"));
    if (request.getParameter("submit") != null) {
        if(request.getParameter("inputtext") != null){
                // word is found
                out.println("<html>");
            out.println("<head><title>English to Spanish Translator</title>");
            out.println("<style>h1,h2,p{text-align:center;color:white}body{background-color:black;}</style></head>");
            out.println("<body>");
            out.println("<h1>Here is your Translation of the word: " + request.getParameter("inputtext") + "</h1>");
            out.println("<h2>" + value + "</h2>");
            out.println("<p><a href='./Translate'>Translate Another Word</a></p>");
            out.println("</body></html>");
            out.close();
        } else if(request.getParameter("inputtext") == null){
            // word is not in translator
            out.println("<html>");
            out.println("<head><title>English to Spanish Translator</title></head>");
            out.println("<body>");
            out.println("<h1>The Word " + request.getParameter("inputtext") + " is     not in the translation</h1>");
            out.println("<p><a href='./Translate'>Translate Another Word</a></p>");
            out.println("</body></html>");
            out.close();
        }
        }
    }

}

最佳答案

您解析该行的方式是错误的。
试试这个(你可以用更好的方式处理空间,这只是一个简单的例子):

    if(reader != null){
        while ((line = reader.readLine()) != null) {
            if ((line.length()>0)&&(line.charAt(0) != '#')){
                String[] tokens = line.split("\\s+", 2);
                lists.put(tokens[0], tokens[1]);
            }
        }

        Iterator iterator = lists.keySet().iterator();  

        while (iterator.hasNext()) {  
           String key = iterator.next().toString();  
           String value = lists.get(key).toString();  

           System.out.println("KEY: " +key + " VALUE:" + value);  
        }
    }

输出为:

KEY: aardvarks VALUE:osos hormigueros
KEY: a VALUE:un, uno, una[Article]
KEY: aback VALUE:hacia atrás
KEY: ab VALUE:prefijo que indica separacio/n
KEY: aardvark VALUE:oso hormiguero[Noun]

但是,上述解决方案的问题是它无法处理重复的KEY,如果KEY相同,新的VALUE将替换旧的VALUE。如果要解决此问题,请先调用 containsKey() 方法,然后再将 KEY-VALUE 对放入 HashMap 中:

  if ((line.length()>0)&&(line.charAt(0) != '#')){
      String[] tokens = line.split("\\s+", 2);
      if (lists.containsKey(tokens[0]) {
           //handle the duplicates
      } else {
          lists.put(tokens[0], tokens[1]);
      }
  }

关于java - 将单词存储到 Hashmap 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25900105/

相关文章:

java - Ant 文件复制不适用于 jdk 7

java - org.hibernate.AnnotationException : No identifier specified for entity: login. 用户

java - 全新安装时出现 XWiki 错误 500

Scala:哈希忽略初始大小(数十亿条目的快速哈希表)

android - 如何将 Hashmap<String,List<Items>> 膨胀到 Recyclerview

纬度和经度的Java String Split问题

java - 将 cookie 中的值设置为 Wicket 中的 TextField<Long>

java - 屏幕共享库

servlets - 如何修复 Tomcat 访问请求的资源被拒绝的问题?

java - 4 键值HashMap?大批?最好的方法?