中级农民
- 积分
- 101
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2018-11-7
- 最后登录
- 1970-1-1
|
在magicsets老哥的基础上改进了一下,原本的test input最后一行1后面的\n好像是个typo.
而且这里省掉了一个状态,算是一个简化。
- class Solution {
- public static void main(String[] args) {
- String doc =
- "John,Smith,[email]john.smith@gmail.com[/email],Los Angeles,1\n" +
- "Jane,Roberts,[email]janer@msn.com[/email],\"San Francisco, CA\",0\n" +
- "\"Alexandra \"\"Alex\"\"\",Menendez,[email]alex.menendez@gmail.com[/email],Miami,1 " +
- "\"\"\"Alexandra, Alex\"\"\"";
- System.out.println(CSVParser.Convert(doc));
- }
- static class CSVParser {
- private enum State {
- FIELD_START,
- QUOTE_START,
- QUOTE_IN_QUOTE
- }
- public static String Convert(String doc) {
- StringBuilder sb = new StringBuilder();
- State state = State.FIELD_START;
- for (int i = 0; i < doc.length(); ++i) {
- char ch = doc.charAt(i);
- switch (state) {
- case FIELD_START:
- if (ch == '"') {
- state = State.QUOTE_START;
- continue;
- } else if (ch == ',') {
- ch = '|';
- }
- break;
- case QUOTE_START:
- if (ch == '"') {
- state = State.QUOTE_IN_QUOTE;
- continue;
- }
- break;
- case QUOTE_IN_QUOTE:
- switch (ch) {
- case '"': state = State.QUOTE_START; break;
- case ',': state = State.FIELD_START; ch = '|'; break;
- default: Error(i, ch);
- }
- break;
- }
- sb.append(ch);
- }
- return sb.toString();
- }
- private static void Error(int position, char ch) {
- throw new RuntimeException(
- "Invalid character " + ch + " at position " + position);
- }
- }
- }
复制代码 |
|