package com.dianping.pigeon.remoting.common.util; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class SplitterUtils { public static StringSplitter by(char delimiter) { return new StringSplitter(delimiter); } public static MapSplitter by(char pairSeparator, char keyValueSeparator) { return new MapSplitter(pairSeparator, keyValueSeparator); } public static StringSplitter by(String delimiter) { return new StringSplitter(delimiter); } public static TableSplitter by2(char recordSeparator, char columnSeparator) { return new TableSplitter(recordSeparator, columnSeparator); } public static class MapSplitter { private char m_pairSeparator; private char m_keyValueSeparator; private boolean m_trim; MapSplitter(char pairSeparator, char keyValueSeparator) { m_pairSeparator = pairSeparator; m_keyValueSeparator = keyValueSeparator; } protected void doCharSplit(String str, Map<String, String> map) { int len = str.length(); StringBuilder key = new StringBuilder(len); StringBuilder value = new StringBuilder(len); boolean inKey = true; for (int i = 0; i < len; i++) { char ch = str.charAt(i); if (ch == m_keyValueSeparator && inKey) { inKey = false; } else if (ch == m_pairSeparator) { if (key.length() > 0) { if (m_trim) { map.put(key.toString().trim(), value.toString().trim()); } else { map.put(key.toString(), value.toString()); } } key.setLength(0); value.setLength(0); inKey = true; } else { if (inKey) { key.append(ch); } else { value.append(ch); } } } if (key.length() > 0) { if (m_trim) { map.put(key.toString().trim(), value.toString().trim()); } else { map.put(key.toString(), value.toString()); } } } public Map<String, String> split(String str) { return split(str, new LinkedHashMap<String, String>()); } public Map<String, String> split(String str, Map<String, String> map) { if (str != null) { doCharSplit(str, map); } return map; } public MapSplitter trim() { m_trim = true; return this; } } public static class StringSplitter { private char m_charDelimiter; private String m_stringDelimiter; private boolean m_trim; private boolean m_noEmptyItem; StringSplitter(char delimiter) { m_charDelimiter = delimiter; } StringSplitter(String delimiter) { m_stringDelimiter = delimiter; } protected void doCharSplit(String str, List<String> list) { char delimiter = m_charDelimiter; int len = str.length(); StringBuilder sb = new StringBuilder(len); for (int i = 0; i < len + 1; i++) { char ch = i == len ? delimiter : str.charAt(i); if (ch == delimiter) { String item = sb.toString(); sb.setLength(0); if (m_trim) { item = item.trim(); } if (m_noEmptyItem && item.length() == 0) { continue; } list.add(item); } else { sb.append(ch); } } } protected void doStringSplit(String source, List<String> list) { String delimiter = m_stringDelimiter; int len = delimiter.length(); int offset = 0; int index = source.indexOf(delimiter, offset); while (true) { String part; if (index == -1) { // last part part = source.substring(offset); } else { part = source.substring(offset, index); } if (m_trim) { part = part.trim(); } if (!m_noEmptyItem || part.length() > 0) { list.add(part); } if (index == -1) { // last part break; } else { offset = index + len; index = source.indexOf(delimiter, offset); } } } public StringSplitter noEmptyItem() { m_noEmptyItem = true; return this; } public List<String> split(String str) { return split(str, new ArrayList<String>()); } public List<String> split(String str, List<String> list) { if (str != null) { if (m_charDelimiter > 0) { doCharSplit(str, list); } else if (m_stringDelimiter != null) { doStringSplit(str, list); } } return list; } public StringSplitter trim() { m_trim = true; return this; } } public static class TableSplitter { private char m_recordSeparator; private char m_columnSeparator; private boolean m_trim; TableSplitter(char recordSeparator, char columnSeparator) { m_recordSeparator = recordSeparator; m_columnSeparator = columnSeparator; } protected void doCharSplit(String str, List<List<String>> lines) { int len = str.length(); List<String> line = new ArrayList<String>(); StringBuilder sb = new StringBuilder(256); for (int i = 0; i < len; i++) { char ch = str.charAt(i); if (ch == m_recordSeparator) { String item = sb.toString(); if (m_trim) { item = item.trim(); } if (item.length() > 0) { line.add(item); } if (!line.isEmpty()) { lines.add(line); } sb.setLength(0); line = new ArrayList<String>(); } else if (ch == m_columnSeparator) { if (m_trim) { line.add(sb.toString().trim()); } else { line.add(sb.toString()); } sb.setLength(0); } else { sb.append(ch); } } if (sb.length() > 0) { String item = sb.toString(); if (m_trim) { item = item.trim(); } if (item.length() > 0) { line.add(item); } } if (!line.isEmpty()) { lines.add(line); } } public List<List<String>> split(String str) { if (str == null) { return Collections.emptyList(); } List<List<String>> lines = new ArrayList<List<String>>(); doCharSplit(str, lines); return lines; } public TableSplitter trim() { m_trim = true; return this; } } }