小明思考

Just a software engineer
posts - 124, comments - 36, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

     摘要: Java 控制台中文问题  阅读全文

posted @ 2012-01-19 16:18 小明 阅读(3691) | 评论 (1)编辑 收藏

最近开发的一个通用网络爬虫平台,主要是想满足自己想从特定网站抓取大量内容的需求,有如下特点:

1. 支持cookie/session,所以支持登录论坛和网站
2. 支持图像识别,可以由人工识别或者机器识别
3. 多线程下载,性能不错
4. 支持代理
5. 支持HTTPS和证书验证
6. 支持可插拔脚本,对特别网站使用特别的脚本(javascript编写)。
7. 有Web界面,操作方便

项目位置:http://code.google.com/p/ssnaker/
下载:http://ssnaker.googlecode.com/files/snaker_1.00_b7.zip

最新的版本也实现一个火车票刷票的功能(具体实现都放在engines/train.js)


posted @ 2012-01-13 15:45 小明 阅读(3207) | 评论 (1)编辑 收藏

原题:
http://community.topcoder.com/stat?c=problem_statement&pm=164&rd=50

Class Name: Prerequisites

Mathod Name: orderClasses

Parameters: String[]

Returns: String[]

 

You are a student at a college with the most unbelievably complex prerequisite

structure ever. To help you schedule your classes, you decided to put together

a program that returns the order in which the classes should be taken. 

 

Implement a class Prerequisites which contains a method orderClasses. The

method takes a String[] that contains the classes you must take and returns a

String[] of classes in the order the classes should be taken so that all

prerequisites are met.

 

String[] elements will be of the form (and TopCoder will ensure this):

"CLASS: PRE1 PRE2 ..." where PRE1 and PRE2 are prerequisites of CLASS. CLASS,

PRE1, PRE2, ... consist of a department name (3 or 4 capital letters, A-Z

inclusive) followed by a class number (an integer between 100 and 999,

inclusive). The department name should be immediately followed by the class

number with no additional characters, numbers or spaces (i.e. MATH217). It is

not necessary for a class to have prerequisites. In such a case, the colon is

the last character in the String. 

 

You can only take one class at a time, therefore, use the following rules to

determine which class to take :

1) Any prerequisite class(es) listed for a class must be taken before the class

can be taken.

2) If multiple classes can be taken at the same time, you take the one with the

lowest number first, regardless of department.

3) If multiple classes with the same number can be taken at the same time, you

take the department name which comes first in alphabetical order. 

4) If the inputted course schedule has errors, return a String[] of length 0.

There is an error if it is impossible to return the classes in an order such

that all prerequisites are met, or if a prerequisite is a course that does not

have its own entry in the inputted String[].

 

Examples of valid input Strings are:

"CSE111: CSE110 MATH101"

"CSE110:"

 

Examples of invalid input Strings are:

"CS117:" (department name must consist of 3 - 4 capital letters, inclusive)

"cs117:" (department name must consist of 3 - 4 capital letters, inclusive)

"CS9E11:" (department name must be letters only)

"CSE110: " (no trailing spaces allowed)

"CSE110: CSE101 " (no trailing spaces allowed)

"MATH211: MAM2222" (class number to large)

"MATH211: MAM22" (class number to small)

"ENGIN517: MATH211" (department name to large)

 

Here is the method signature (be sure your method is public):

String[] orderClasses(String[] classSchedule);

 

TopCoder will make sure classSchedule contains between 1 and 20 Strings,

inclusive, all of the form above. The Strings will have between 1 and 50

characters, inclusive. TopCoder will check that the syntax of the Strings are

correct: The Strings will contain a valid class name, followed by a colon,

possibly followed by a series of unique prerequisite classes separated by

single spaces. Also, TopCoder will ensure that each class has at most one

entry in the String[].

 

Examples:

If classSchedule={

"CSE121: CSE110",

"CSE110:",

"MATH122:",

}

The method should return: {"CSE110","CSE121","MATH122"}

 

If classSchedule={

"ENGL111: ENGL110",

"ENGL110: ENGL111"

}

The method should return: {}

 

If classSchedule=[

"ENGL111: ENGL110"

}

The method should return: {}

 

If classSchedule={

"CSE258: CSE244 CSE243 INTR100"

"CSE221: CSE254 INTR100"

"CSE254: CSE111 MATH210 INTR100"

"CSE244: CSE243 MATH210 INTR100"

"MATH210: INTR100"

"CSE101: INTR100"

"CSE111: INTR100"

"ECE201: CSE111 INTR100"

"ECE111: INTR100"

"CSE243: CSE254"

"INTR100:"

}

The method should return:

{"INTR100","CSE101","CSE111","ECE111","ECE201","MATH210","CSE254","CSE221","CSE2

43","CSE244","CSE258"}

 

 

Definition

          

Class:      Prerequisites

Method:   orderClasses

Parameters:     String[]

Returns: String[]

Method signature:   String[] orderClasses(String[] param0)

(be sure your method is public)


------------------------------------------------------------我的解法如下----------------------------------------

想法很简单,这道题本质上是一道排序问题,我们只需要定义好排序的逻辑,然后应用快排就可以了。


import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Prerequisites {
    
private static final String[] EMPTY = {};
    Map
<String,Klass> classes = new HashMap<String,Klass>();
    
    
static class Klass implements Comparable<Klass>{
        String name;
        
int number;
        String dept;
        List
<Klass> pres = new ArrayList<Klass>();
        
boolean exist = false;
        
        Klass(String name){
            
this.name = name;
            
int len = name.length();
            
this.number = Integer.parseInt(name.substring(len-3));
            
this.dept =name.substring(0,len-3);
        }
        
        
private boolean isPre(Klass k){
            
if(k==thisreturn false;
            
            
for(Klass p:this.pres){
                
if(k == p || p.isPre(k)) return true;
            }
            
return false;
        }

        @Override
        
public int compareTo(Klass that) {
            
boolean pre = this.isPre(that);
            
boolean sub = that.isPre(this);
            
            
if(pre && sub){
                
throw new RuntimeException("circle detected");
            }
            
else if(pre){
                
return 1;
            }
            
else if(sub){
                
return -1;
            }
            
if(this.number!=that.number) return this.number-that.number;
            
return this.dept.compareTo(that.dept);
        }
    }
    
    
private Klass getClass(String name){
        Klass k 
= classes.get(name);
        
if(k==null){
            k 
= new Klass(name);
            classes.put(name, k);
        }
        
return k;
    }
    
    
public String[] orderClasses(String[] classSchedule){
        classes.clear();
        //parse the input
        
for(String s:classSchedule){
            
int idx = s.indexOf(":");
            String name 
= s.substring(0,idx);
            Klass k 
= getClass(name);
            k.exist 
= true;
            
if(idx!=s.length()-1){
                String[] pres 
= s.substring(idx+1).split(" ");
                
for(String pre:pres){
                    
if(pre.length()>0){
                        Klass p 
= getClass(pre);
                        k.pres.add(p);
                    }
                }
            }
        }
        
        Klass [] sortedClasses 
=  (Klass[]) classes.values().toArray(new Klass[0]);
        
for(Klass k:sortedClasses){
            
if(!k.exist){
                
return EMPTY;
            }
        }
        
try {
            Arrays.sort(sortedClasses);
        } 
catch (Exception e) {
            
return EMPTY;
        }
        String[] result 
= new String[sortedClasses.length];
        
int c = 0;
        
for(Klass k:sortedClasses){
            result[c
++= k.name;
        }
        
return result;
    }
}


posted @ 2011-10-25 13:28 小明 阅读(1804) | 评论 (3)编辑 收藏

Here is my some recommendations for java i18n .

1.  The correct way to handle text-based resource files for localization

 Use java.util.ResourceBoundle to read resource from file.

e.g.
 Local local = Local.CHINA;
 ResourceBundle rb = ResourceBundle.getBundle("test", local);
 String title = rb.getString("helloworld.title");
 System.out.println(title);

 //The program will read file: test_zh.properties
 # This locale is zh_CN
 # helloworld.title=中文1234
 and the file should use native2ascii program to convert (native2ascii.exe is in JDK)
 # This locale is zh_CN
 helloworld.title=\u4f60\u597d1234

 if you don't use native2ascii  to covert,you must covert it in the java program,like this:
 ResourceBundle rb = ResourceBundle.getBundle("test", Locale.CHINA);
     String title = rb.getString("helloworld.title");
    System.out.println(new String(title.getBytes("8859_1")));  //covert to os/jvm default charset

2.       Locale driven date and time display
 
 Use java.text.DateFormat to format date string
e.g.
 DateFormat df = DateFormat.getDateInstance(DateFormat.FULL,Locale.CHINA);
 String date = df.format(new Date());
    System.out.println(date);

 DateFormat df2 = DateFormat.getDateTimeInstance(DateFormat.DEFAULT,DateFormat.DEFAULT,Locale.CHINA);
 String datetime = df2.format(new Date());
    System.out.println(datetime);

3.       JSP localization method.

1) native method:
 use "Local local = request.getLocale();" to get the page accessor's local info
 then use ResourceBoundle to read local resource
 and page should use utf-8 charset
 
e.g.
<%@ page contentType="text/html; charset=utf-8" %>
<%
Local local = request.getLocale();
ResourceBundle rb = ResourceBundle.getBundle("test", local);
String title = rb.getString("helloworld.title");
%>
<html>
<head>
<title>test</title>
</head>
<body bgcolor="#ffffff">
<h1><%=title%></h1>
</body>
</html>
notice:put the  test_zh.properties into directionary WEB_INF/classes

2)use jsp taglib to simplify the page

 the Jakarta i18n taglib is a good choice. http://jakarta.apache.org/taglibs/doc/i18n-doc/index.html
e.g.
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib uri="http://jakarta.apache.org/taglibs/i18n-1.0" prefix="i18n" %>
<i18n:bundle baseName="test" id="test" localeRef="userLocale"
             scope="request"
             changeResponseLocale="false"/>
<html>
<head>
<title>test</title>
</head>
<body bgcolor="#ffffff">
<h1><i18n:message key="helloworld.title" /></h1>
</body>
</html>

3)use j2ee web framework(Struts) to simplify

 the Struts web framework supply i18n support
 Please refer: http://www.allapplabs.com/struts/struts_internationalization.htm

posted @ 2005-12-19 17:26 小明 阅读(1106) | 评论 (1)编辑 收藏


java blog:  http://www.blogjava.net/sandy

cpp blog:  http://www.cppblog.com/sandy

欢迎参观。

posted @ 2005-12-06 10:08 小明 阅读(446) | 评论 (0)编辑 收藏

仅列出标题
共5页: 上一页 1 2 3 4 5