java核心技术上的一道课后习题从控制台输入一个java源文件名,然后生成一个与之对应的html文件,要求打开生成的html文件后,java关键字用蓝色显示,注释用绿色显示,其他语句默认黑色显示。这是Map后面的习题,我的想法是从文件中分离出关键字字符串和一般语句字符串以及注释字符串,然后分别为这三种类型的字符串配对一个Integer类型的值,表示类型(是关键字还是其他),然后将这些字符串和其Integer值构成一个映射存在map中。然后将这些字符串分别以对应的颜色写入html文件,到这里我不会将其以对应的颜色写入啊,求大家帮忙。

解决方案 »

  1.   

    你存在了MAP中,那么取出来的会是无序的,这个问题如何解决?
    我倾向用正则表达式或者其他的字符串搜索算法,找到匹配的字符串就替换为相应的HTML代码,然后写入文件。
      

  2.   

    <color="#FF0000">sample text</color>
      

  3.   

    这个题要是考虑仔细了,应该是非常复杂的,比如一个字符串里" I love for 循环",这里面有个for,是java关键字,但是不应该标红。同理,注释里面的关键字也不应该标红。有些关键字前后都是空格,而有关键字后面可以跟括号(如for,while,if)等等,情况好复杂啊简单写了一个,仅仅能将前后有空格的关键字标红,但是能在网页中保持缩进格式。提供一个思路,仅供参考。
    public class Test { public static void main(String[] args) throws Exception {
    Scanner sc = new Scanner(new File("E:/eclipse 3.6.2/workspace/MySQL/src/andycpp/SQLTest.java"));
    StringBuilder builder = null;
    StringBuilder result = new StringBuilder();
    result.append(createHtmlHeader());
    String s = null;
    while(sc.hasNext()) {
    builder = new StringBuilder("<div>");
    builder.append(String(sc.nextLine()));
    builder.append("</div>");
    s = builder.toString();
    if(s.matches("<div>\\s*</div>")) {
    s = "<br/>";
    }
    result.append(s+"\n");
    }
    result.append(createHtmlFooter());
    saveToFile("d:/aa.html", result.toString());
    }

    private static String String(String s) {
    StringBuilder sb = new StringBuilder();
    Pattern p = Pattern.compile("(\\s+|\\S+)");
    Matcher m = p.matcher(s);
    String token = null;
    while(m.find()) {
    token = m.group();
    if(Character.isWhitespace(token.charAt(0))) {
    sb.append(Space(token));
    }else {
    sb.append(Keys(token));
    }
    }

    return sb.toString();
    }

    private static String Space(String token) {
    StringBuilder sb = new StringBuilder();
    char c;
    for(int i=0; i<token.length(); i++) {
    c = token.charAt(i);
    if(c == ' ') {
    sb.append("&nbsp;");
    }else {
    sb.append("&nbsp;&nbsp;&nbsp;&nbsp;");
    }
    }
    return sb.toString();
    }

    private static String Keys(String token) {
    String[] keyWords = {"package", "import", "public", "private", "static", "void", "new", "throws", "while", "for", "class"};
    HashSet<String> set = new HashSet<String>(Arrays.asList(keyWords));
    StringBuilder sb = new StringBuilder();
    if(set.contains(token)) {
    sb.append("<span class=\"keyword\">");
    sb.append(token);
    sb.append("</span>");
    }else {
    sb.append(token);
    }
    return sb.toString();
    } private static String createHtmlHeader() {
    StringBuilder sb = new StringBuilder();
    sb.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n");
    sb.append("\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n");
    sb.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">\n");
    sb.append("<head>\n");
    sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n");
    sb.append("<style type=\"text/css\">\n");
    sb.append(".keyword {\n");
    sb.append(" color:#F00;\n");
    sb.append("}\n");
    sb.append("div {\n");
    sb.append(" font-family:\"Courier New\", Courier, monospace;\n");
    sb.append(" font-size:16px;\n");
    sb.append("}\n");
    sb.append("</style>\n");
    sb.append("<title>无标题文档</title>\n");
    sb.append("</head>\n");
    sb.append("<body>\n");
    return sb.toString();
    }

    private static String createHtmlFooter() {
    StringBuilder sb = new StringBuilder();
    sb.append("</body>\n");
    sb.append("</html>\n");
    return sb.toString();
    }

    private static void saveToFile(String dest, String s) {
    try {
    OutputStreamWriter w = new OutputStreamWriter(new FileOutputStream(dest), Charset.forName("UTF-8"));
    PrintWriter writer = new PrintWriter(w);
    writer.print(s);
    writer.close();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }
    }
    }