当前位置: 代码迷 >> J2SE >> 关于文档扫描有关问题
  详细解决方案

关于文档扫描有关问题

热度:9534   发布时间:2013-02-25 00:00:00.0
关于文档扫描问题
大师们,我有关于文档扫描问题想问问大家。
比如这是文档:
{
123
123
123
}
{
123
123
123
}
{
123
123
123
}

怎么把每个{}里面的内容扫描出来。
条件是第一个123是做key放进Hashmp
其他123放进ArrayList
然后123key 指向 每个 ArrayList

我需要比较快的扫描方法。

谢谢!!

下面是本人自己写的code
大家看下有什么 多余的。

private static HashMap<String, ArrayList<String>> GetAllWords()
{
try{
Scanner s = new Scanner(f);
while(s.hasNext())
{
//If you want to add word instead of sentence, change nextLine to next
String st = s.nextLine();
if(st.equals("{"))
{
String key = s.nextLine();
as = new ArrayList<String>();
while(!st.equals("}")){
String sthToAdd = s.nextLine();
if(!sthToAdd.equals("{") && !sthToAdd.equals("}"))
{
as.add(sthToAdd);
HM.put(key, as);
}
else
break;
}
}
}
}
catch(Exception e){
System.out.println("error");}
return HM;
}

------解决方案--------------------------------------------------------
程序应该可用,不过逻辑看起来较为复杂,建议用“有穷自动状态机”,除了能解决复杂结构问题外,还可以纠错:

Java code
public class TextToStruct {    public static void main(String[] args) {        textToMapList();    }    enum STATUS {        WaitForNew, WaitForKey, WaitForValue    }    public static void textToMapList() {        String source = "{\n123\n121\n122\n}\n{\n333\n113\n113\n}\n{\n123\n121\n123\n}\n";        Map<String, List> map = new HashMap<String, List>(); // 存放结果的Map        STATUS status = STATUS.WaitForNew; // 有穷状态自动机的状态标志        List<String> tmp = null; // 存放当前Value的临时List        Scanner sc = new Scanner(source); // 输入源        // 有穷状态自动机        while (sc.hasNextLine()) {            String line = sc.nextLine().trim();            if (line.length() == 0) {                continue; // 空行直接忽略            }            // 状态自动处理器            switch (status) {            case WaitForNew: // 需要处理 {                if ("{".equals(line)) {                    status = STATUS.WaitForKey;                } else { // 发现源数据结构错误,需要起始标志 {,但没有得到                    throw new RuntimeException("Except {, but get: " + line);                }                break;            case WaitForKey: // 需要处理 Key                if (!map.containsKey(line)) { // 查找是否已经有过该Key                    map.put(line, new ArrayList<String>());                }                tmp = map.get(line); // 准备List                status = STATUS.WaitForValue;                break;            case WaitForValue: // 需要处理 值 和 }                if ("}".equals(line)) {                    tmp = null;                    status = STATUS.WaitForNew;                } else {                    tmp.add(line);                }                break;            }        }        // 输出结果        for (String key : map.keySet()) {            System.out.println(key + ": " + map.get(key));        }    }}
  相关解决方案