VML路径的字符串处理 [英] String manipulation for VML Path

查看:116
本文介绍了VML路径的字符串处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Java字符串操作来解析VML路径值.我想检索路径中的所有命令,例如 MoveTo LineTo CurveTo RLineTo (其他命令)以及它们相应的 x y 坐标/参数.

Hi I am trying to parse VML Path value using Java String manipulation. I want to retreive all the commands in the path like MoveTo, LineTo, CurveTo, RLineTo (other commands) and their corresponding x and y coordinates/parameters.

这里是要解析的示例数据,每个命令都有自己的x,y坐标.

Here are example data to parse, each command has their own x,y coordinates.

 1. m1,1 l1,200,200,200,200,1 xe
 2. m, l1,200,200,200,200,1 xe

在检索命令和每个命令的参数时,您是否可以建议算法或代码? 例如数字1.

Can you suggest an algorithm or code on retreiving the commands and the parameters for each command? For example in number 1.

Command = moveto 'm'

Command Parameters = (x=1,y=1).

参考: http://www.w3.org/TR/NOTE-VML#_Toc416858391

这有点奇怪,但是我尝试使用

This is something weird but I tried using StringTokenizer like

StringTokenizer tokenizer = new StringTokenizer(path);

一个朋友建议使用StringTokenizer,它做了一些接近我的目标的事情,它给了我以下数据.也许我可以利用StringTokenizer来满足我的需求.

A friend suggested using StringTokenizer and it did something near to my goal, it gave me the following data. Maybe I can utilize StringTokenizer to suit my needs.

m1,1
l1,200,200,200,200,1
xe

对于#1,这是理想的输出. (伪代码)

For #1, here is the ideal output. (pseudocode)

String command_type = "m"        List<String, String> parameters =   add("1", "1")
String command_type = "l"        List<String, String> parameters =   add("1", "200")
                                                                     add("200", "200")
                                                                     add("200", "1")
String command_type = "x"        (can have no parameter )
String command_type = "e"        (can have no parameter )

对于#2,这是理想的输出. (伪代码)

For #2, here is the ideal output. (pseudocode)

String command_type = "m"        List<String, String> parameters =   add("0", "0")  // because the x and y parameters are not specified so I need to force them to 0,0
String command_type = "l"        List<String, String> parameters =   add("1", "200")
                                                                     add("200", "200")
                                                                     add("200", "1")
String command_type = "x"        (can have no parameter )
String command_type = "e"        (can have no parameter )

推荐答案

好的规范在这里很重要,但是基于我猜到的示例输入和输出,

A good spec is important here but based on your sample input and output I have guessed:

字母->逗号分隔参数->字母->逗号分隔参数

Letter -> comma separated parameters -> letter -> comma separated parameters

我还注意到命令之间没有空格.例如您将xe作为两个单独的命令.这意味着您的示例空间中没有任何意义,可以忽略.

I have also noted that commands are not separated by spaces. e.g. you have xe as two separate commands. This means that in your sample spaces have no meaning and can be ignored.

我还注意到命令都是单个字母. (否则,xe不会作为两个命令出现)

I also note that commands are all single letters. (Otherwise xe wouldn’t come as two commands)

也参数必须成对出现并且必须是数字.我在您的样本中没有看到负数,但我认为这是可能的.我还将假定它们是整数,而不是小数.

Also Parameters must come in pairs and must be numbers. I see no negative numbers in your sample but I assume that these are possible. I will also assume that they are integers and not decimals.

因此,根据假定的规格,我可以为您提供一个可能的解决方案,以供您查看并确定其工作情况.

So based on the assumed spec I can come up with a possible solution for you to have a look through and work out what it is doing.

package ic.ac.uk.relationshipvisualiser.app;

import java.util.ArrayList;
import java.util.List;

public class TmpNoFXTest {

    private static class coOrd {
        int x = 0;
        int y = 0;
        public coOrd(int p_x,int p_y) {
            x=p_x;y=p_y;
        }
        public int getX() {return x;}
        public int getY() {return y;}
    }
    private static class command {
        String command = "";
        List<coOrd> param_list = new ArrayList<coOrd>();

        public command(String p_command) {
            command = p_command;
        }
        private String parseOneParam(String p_inp) {
            if (p_inp.equals("")) return "";
            if (isLetter(p_inp.substring(0,1))) return p_inp;
            int firstChar = 0;
            for (int c=0;c<p_inp.length();c++) {
                if (firstChar==0) {
                    if (isLetter(p_inp.substring(c,c+1))) {
                        firstChar = c;
                    }
                }
            }

            String parms = p_inp.substring(0,firstChar);
            if (parms.length()==0) return p_inp.substring(firstChar);
            int x = 0;
            int y = 0;

            int p = 0;
            String tmp = "";
            while ((p<parms.length()) && (!parms.substring(p,p+1).equals(","))) {
                tmp = tmp + parms.substring(p,p+1);
                p++;
            }
            p++;
            if (tmp.length()>0) {
                x = Integer.parseInt(tmp);
            }

            tmp = "";
            while ((p<parms.length()) && (!parms.substring(p,p+1).equals(","))) {
                tmp = tmp + parms.substring(p,p+1);
                p++;
            }

            if (p_inp.substring(p,p+1)==",") p++;

            if (tmp.length()>0) {
                y = Integer.parseInt(tmp);
            }

            param_list.add(new coOrd(x,y));

            return p_inp.substring(p);
        }
        public String parseParams(String p_inp) {
            if (p_inp.equals("")) return "";
            while (!isLetter(p_inp)) {
                p_inp = parseOneParam(p_inp);
            }
            return p_inp;
        }
        public String toString() {
            String ret = "";
            ret = "String command_type = \"" + command + "\"";
            if (param_list.size()==0) return ret + "     (can have no parameter )";


            for (int c=0;c<param_list.size();c++) {
                if (c>0) ret += "\n                         ";
                ret += "        List<String, String> parameters =   add(\"" + param_list.get(c).getX() + "\", \"" + param_list.get(c).getY() + "\")";               
            }

            return ret;
        }
    }
    private static boolean isLetter(String p_inp) {
        return p_inp.substring(0,1).matches("\\p{L}");
    }


    private static String parseSingleCommand(String p_inp, List<command> p_cmds) throws Exception {
        //Read a single command off the incoming string and pass the remaining input back

        String cmd = p_inp.substring(0,1);
        if (!isLetter(p_inp)) throw new Exception("Error command starts with non letter (" + cmd + ")");


        p_inp = p_inp.substring(1);
        command c = new command(cmd);
        p_inp = c.parseParams(p_inp);

        p_cmds.add(c);
        return p_inp;
    }

    private static List<command> parse(String p_inp) throws Exception {
        List<command> r = new ArrayList<command>();

        //spaces don't matter and I want to make this case-insensitive to minimise errors
        p_inp = p_inp.toLowerCase();
        p_inp = p_inp.replace(" ", "");

        while (p_inp.length()>0) {
            p_inp = parseSingleCommand(p_inp,r);
        }
        return r;
    }

    public static void main(String[] args) {
        System.out.println("Start tmpTest");

        List<String> tests = new ArrayList<String>();
        tests.add("m1,1 l1,200,200,200,200,1 xe");
        tests.add("m, l1,200,200,200,200,1 xe");

        for (int c=0;c<tests.size();c++) {
            System.out.println("Running test case " + c + " (" + tests.get(c) + ")");
            try {
                List<command> pr = parse(tests.get(c));

                for (int d=0;d<pr.size();d++) {
                    System.out.println(pr.get(d).toString());
                }

            } catch (Exception e) {
                e.printStackTrace();
                return;
            }
        };

        System.out.println("End tmpTest");
    }
}

这篇关于VML路径的字符串处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆