/*
*
* Copyright c 2005-2009.
*
* Licensed under GNU LESSER General Public License, Version 3.
* http://www.gnu.org/licenses
*
*/
/********************************************************************************
* @author chaostone
*
* MODIFICATION DESCRIPTION
*
* Name Date Description
* ============ ============ ============
* chaostone 2006-7-14 Created
*
********************************************************************************/
package org.beanfuse.lang;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
public final class SeqStringUtil {
public static final String DELIMITER = ",";
private SeqStringUtil() {
}
/**
* 将两个用delimiter串起来的字符串,合并成新的串,重复的"单词"只出现一次.
* 如果第一个字符串以delimiter开头,第二个字符串以delimiter结尾,<br>
* 合并后的字符串仍以delimiter开头和结尾.<br>
* <p>
* <blockquote>
*
* <pre>
* mergeSeq(",1,2,", "") = ",1,2,";
* mergeSeq(",1,2,", null) = ",1,2,";
* mergeSeq("1,2", "3") = "1,2,3";
* mergeSeq("1,2", "3,") = "1,2,3,";
* mergeSeq(",1,2", "3,") = ",1,2,3,";
* mergeSeq(",1,2,", ",3,") = ",1,2,3,";
* </pre>
*
* </blockquote>
* <p>
*
* @param first
* @param second
* @return
*/
public static String mergeSeq(final String first, final String second,
final String delimiter) {
if (StringUtils.isNotEmpty(second) && StringUtils.isNotEmpty(first)) {
List firstSeq = Arrays.asList(StringUtils.split(first, delimiter));
List secondSeq = Arrays
.asList(StringUtils.split(second, delimiter));
Collection rs = CollectionUtils.union(firstSeq, secondSeq);
StringBuilder buf = new StringBuilder();
for (Iterator iter = rs.iterator(); iter.hasNext();) {
String ele = (String) iter.next();
buf.append(delimiter).append(ele);
}
if (buf.length() > 0) {
buf.append(delimiter);
}
return buf.toString();
} else {
return ((first == null) ? "" : first)
+ ((second == null) ? "" : second);
}
}
public static String mergeSeq(final String first, final String second) {
return mergeSeq(first, second, DELIMITER);
}
/**
* 判断两个","逗号相隔的字符串中的单词是否完全等同.
*
* @param first
* @param second
* @return
*/
public static boolean isEqualSeq(final String first, final String second,
final String delimiter) {
if (StringUtils.isNotEmpty(first) && StringUtils.isNotEmpty(second)) {
String[] firstWords = StringUtils.split(first, delimiter);
Set firstSet = new HashSet();
for (int i = 0; i < firstWords.length; i++) {
firstSet.add(firstWords[i]);
}
String[] secondWords = StringUtils.split(second, delimiter);
Set secondSet = new HashSet();
for (int i = 0; i < secondWords.length; i++) {
secondSet.add(secondWords[i]);
}
return firstSet.equals(secondSet);
} else {
return StringUtils.isEmpty(first) & StringUtils.isEmpty(second);
}
}
/**
* 返回一个新的逗号相隔字符串,实现其中的单词a-b的功能. 新的字符串将以,开始,结束<br>
*
* @param first
* @param second
* @param delimiter
* @return
*/
public static String subtractSeq(String first, String second,
String delimiter) {
if (StringUtils.isEmpty(first)) {
return "";
}
if (StringUtils.isEmpty(second)) {
StringBuilder builder = new StringBuilder();
if (!first.startsWith(delimiter)) {
builder.append(delimiter).append(first);
}
if (!first.endsWith(delimiter)) {
builder.append(first).append(delimiter);
}
return builder.toString();
}
List firstSeq = Arrays.asList(StringUtils.split(first, delimiter));
List secondSeq = Arrays.asList(StringUtils.split(second, delimiter));
Collection rs = CollectionUtils.subtract(firstSeq, secondSeq);
StringBuilder buf = new StringBuilder();
for (Iterator iter = rs.iterator(); iter.hasNext();) {
String ele = (String) iter.next();
buf.append(delimiter).append(ele);
}
if (buf.length() > 0) {
buf.append(delimiter);
}
return buf.toString();
}
public static String subtractSeq(final String first, final String second) {
return subtractSeq(first, second, DELIMITER);
}
/**
* 返回一个新的逗号相隔字符串,实现其中的单词a-b的功能
*
* @param first
* @param second
* @param delimiter
* @return
*/
public static String intersectSeq(final String first, final String second,
final String delimiter) {
if (StringUtils.isEmpty(first) || StringUtils.isEmpty(second)) {
return "";
}
List firstSeq = Arrays.asList(StringUtils.split(first, ","));
List secondSeq = Arrays.asList(StringUtils.split(second, ","));
Collection rs = CollectionUtils.intersection(firstSeq, secondSeq);
StringBuilder buf = new StringBuilder();
for (Iterator iter = rs.iterator(); iter.hasNext();) {
String ele = (String) iter.next();
buf.append(delimiter).append(ele);
}
if (buf.length() > 0) {
buf.append(delimiter);
}
return buf.toString();
}
public static String intersectSeq(final String first, final String second) {
return intersectSeq(first, second, DELIMITER);
}
public static boolean isEqualSeq(final String first, final String second) {
return isEqualSeq(first, second, DELIMITER);
}
public static String removeWord(final String host, final String word) {
return removeWord(host, word, DELIMITER);
}
public static String removeWord(final String host, final String word,
final String delimiter) {
if (host.indexOf(word) == -1) {
return host;
} else {
int beginIndex = host.indexOf(word);
int endIndex = beginIndex + word.length();
if (beginIndex == 0) {
return host.substring(endIndex + 1);
}
if (endIndex == host.length()) {
return host.substring(0, beginIndex - delimiter.length());
} else {
String before = host.substring(0, beginIndex);
String after = host.substring(endIndex + 1);
return before + after;
}
}
}
// TODO bug
public static boolean isIn(final String hostSeq, final String word) {
return hostSeq.indexOf(word) != -1;
}
/**
* 将数组中的字符串,用delimiter串接起来.<br>
* 首尾不加delimiter
*
* @param seq
* @param delimiter
* @return
*/
public static String transformToSeq(final Object[] seq,
final String delimiter) {
if (null == seq || seq.length < 1) {
return "";
} else {
StringBuilder aim = new StringBuilder();
for (int i = 0; i < seq.length; i++) {
if (StringUtils.isNotEmpty(aim.toString())) {
aim.append(delimiter);
}
aim.append(seq[i]);
}
return aim.toString();
}
}
public static String transformToSeq(final String[] seq) {
return transformToSeq(seq, DELIMITER);
}
/**
* @param ids
* @return
*/
public static Long[] transformToLong(final String ids) {
if (StringUtils.isEmpty(ids)) {
return null;
} else {
return transformToLong(StringUtils.split(ids, ","));
}
}
/**
* @param ids
* @return
*/
public static Long[] transformToLong(final String[] ids) {
if (null == ids) {
return null;
}
Long[] idsOfLong = new Long[ids.length];
for (int i = 0; i < ids.length; i++) {
idsOfLong[i] = new Long(ids[i]);
}
return idsOfLong;
}
/**
* @param ids
* @return
*/
public static Integer[] transformToInteger(final String ids) {
if (StringUtils.isEmpty(ids)) {
return null;
} else {
return transformToInteger(StringUtils.split(ids, ","));
}
}
/**
* @param ids
* @return
*/
public static Integer[] transformToInteger(final String[] ids) {
Integer[] idsOfInteger = new Integer[ids.length];
for (int i = 0; i < ids.length; i++) {
idsOfInteger[i] = new Integer(ids[i]);
}
return idsOfInteger;
}
/**
* 将1-2,3,4-9之类的序列拆分成数组
*
* @param numSeq
* @return
*/
public static Integer[] splitNumSeq(final String numSeq) {
if (StringUtils.isEmpty(numSeq)) {
return null;
}
String[] numArray = StringUtils.split(numSeq, ",");
Set numSet = new HashSet();
for (int i = 0; i < numArray.length; i++) {
String num = numArray[i];
if (StringUtils.contains(num, "-")) {
String[] termFromTo = StringUtils.split(num, "-");
int from = NumberUtils.toInt(termFromTo[0]);
int to = NumberUtils.toInt(termFromTo[1]);
for (int j = from; j <= to; j++) {
numSet.add(new Integer(j));
}
} else {
numSet.add(new Integer(num));
}
}
Integer[] nums = new Integer[numSet.size()];
numSet.toArray(nums);
return nums;
}
/**
* 保持逗号分隔的各个单词都是唯一的。并且按照原来的顺序存放。
*
* @param keys
* @return
*/
public static String keepUnique(final String keys) {
String[] keysArray = StringUtils.split(keys, ",");
List keyList = new ArrayList();
for (int i = 0; i < keysArray.length; i++) {
if (!keyList.contains(keysArray[i])) {
keyList.add(keysArray[i]);
}
}
StringBuilder keyBuf = new StringBuilder();
for (Iterator iter = keyList.iterator(); iter.hasNext();) {
keyBuf.append(iter.next());
if (iter.hasNext()) {
keyBuf.append(",");
}
}
return keyBuf.toString();
}
}