使用Guava来处理字符串Split功能

guava的splitter.java位于package com.google.common.base。 拆分字符串本来是一件比较复杂的事情,但是有了这个包里的这个工具,就方便很多了,他远比String.split()强大太多了,下面我们简单认识下

SplitToList : 返回的是一个字符串的List, 示例代码如下:

import java.util.List;
import com.google.common.base.Splitter;

public class Program {
    public static void main(String[] args) {

	String value = "cup,tea,coffee";

	// Use Splitter, on method, and splitToList.
	// ... Separates String on comma.
	List<String> list = Splitter.on(',').splitToList(value);
	for (String element : list) {
	    System.out.println(element);
	}
    }
}

输出为:

cup
tea
coffee

如果你想用ArrayList,可以把他传给ArrayList的构造函数:
	ArrayList<String> result = new ArrayList<>(list);

需要注意的是:split.on()里的参数,既可以是一个字符,也可以是String,还可以是CharMatcher这个类,如代码所示:

import java.util.List;
import com.google.common.base.CharMatcher;
import com.google.common.base.Splitter;

public class Program {
    public static void main(String[] args) {

	String values = "hey, how\nare you\tdoing   my friend?";

	// Split on whitespace with CharMatcher class.
	List<String> results = Splitter.on(CharMatcher.WHITESPACE)
		.omitEmptyStrings().splitToList(values);
	for (String value : results) {
	    System.out.println(value);
	}
    }
}

输出为:

hey,
how
are
you
doing
my
friend?
CharMatcher 可选的值,可以参考这个类。

特殊的是,还可以CharMatcher.anyOf(",;:")这么来指定参数,可以将"one,two:three;four"分成one,two,threee,four.
你还可以指定一个范围:CharMatcher.inRange('0', '3')来把"cat 0 dog 4 1 fish"拆成:cat dog 4 fish。

TrimResults 这个函数从名字就能看出来,能够去除拆分后的结果的首尾的空格。
import com.google.common.base.Splitter;

public class Program {
    public static void main(String[] args) {

	String value = "rock   ,stone, bird,    fish";
	// Split on comma, and trim our results.
	// ... Use split, which returns an Iterable.
	Iterable<String> result = Splitter.on(',').trimResults().split(value);
	for (String v : result) {
	    System.out.println(v);
	}
    }
}

 

以上代码的输出是:

rock
stone
bird
fish
结果前后的空格被去掉了。

OmitEmptyStrings 则可以帮助你去掉不需要的空元素,如果没有调用他会把空元素也返回给你,这个是区别于String.split的地方:
import java.util.List;
import com.google.common.base.Splitter;

public class Program {
    public static void main(String[] args) {

	String values = "cat,,dog,,,fish";
	// Omit empty Strings when splitting.
	List<String> list = Splitter.on(',').omitEmptyStrings()
		.splitToList(values);
	System.out.println(list.toString());
    }
}

输出为:

[cat, dog, fish]


你以为这就够了吗?显然不是。对于复杂类型,他还能直接将他拆成map结构,看下面的例子:

import java.util.Map;
import java.util.Map.Entry;
import com.google.common.base.Splitter;

public class Program {
    public static void main(String[] args) {

	// This String contains key-value pairs.
	String value = "cat=Fluffy,dog=Spot,bird=Chirpy";

	// Use Splitter to parse key-value separators.
	Map<String, String> map = Splitter.on(',').withKeyValueSeparator('=')
		.split(value);
	// Loop over entries.
	for (Entry<String, String> entry : map.entrySet()) {
	    System.out.println("[" + entry.getKey() + "] " + entry.getValue());
	}
    }
}

正如你所预料的,输出结果为:

[cat] Fluffy
[dog] Spot
[bird] Chirpy

需要特别注意的是,这个对格式是严格校验的。
"cat=,dog=Spot,bird=Chirpy" 输出是:
[cat]  (空字符)
[dog] Spot
[bird] Chirpy

"cat,dog=Spot,bird=Chirpy"
你以为上面的字符串会正确的分割成
[dog] Spot
[bird] Chirpy

事实上不是,这个时候会抛一个异常,Chunk is not a valid entry,并且返回的是个null。
所以如果你的字符是用户输入的则需要捕获这个异常,以防止各种输入的可能错误,程序更改如下,事实上,文中的程序永远都不存在,哪有这种构造的已知的字符串呢?
import java.util.Map;
import java.util.Map.Entry;
import com.google.common.base.Splitter;

public class Program {
    private static Logger logger = LoggerFactory.getLogger(BabyCarHelper.class);

    public static void main(String[] args) {


	// This String contains key-value pairs.
	String value = args[0]; //"cat=Fluffy,dog=Spot,bird=Chirpy";

	// Use Splitter to parse key-value separators.
try {
	Map<String, String> map = Splitter.on(',').withKeyValueSeparator('=')
		.split(value);
} catch(Exception e) {
   logger.warn('params is not valid' + value);
}
	// Loop over entries.
	for (Entry<String, String> entry : map.entrySet()) {
	    System.out.println("[" + entry.getKey() + "] " + entry.getValue());
	}
    }
}

 

所以,其实以上这些才是本文的重点,所有的格式一旦有一点不满足,整个表达式都会解析失败,一个都得不到。例如:

"cat,dog=Spot,bird=Chirpy"
"cat=dog=Spot,bird=Chirpy"
"cat=Fluffy,dog,Spot,bird=Chirpy"
而
"cat=,dog=Spot,bird=Chirpy"
则是没问题的,只是他的value是空,你可以试试 "=Fluffy,dog=Spot,bird=Chirpy"是个什么结果。

ps: 再附送一点知识,如果你的map想转成HashMap也非常简单,你只需这样,

HashMap<String, String> hash = new HashMap<>(map);

 



			

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注