1、字符串的处理

  字符串的连接&拆分&匹配及常用操作

  Joiner&Splitter

     @Test
public void testJoiner() {
String[] strs = new String[]{"pan",null,"teng"};
//由于字符串中含有null 因此会抛出异常,需要调用以下方法
//Joiner joiner = Joiner.on("-").skipNulls(); //跳过 null
Joiner joiner = Joiner.on("-").useForNull("空"); //将null用“空” 替换
//joiner.skipNulls(); 这样调用是不行的,不会改变 joiner,需要将skipNulls 返回值赋给joiner才行
String joinStr = joiner.join(strs[0], strs[1], strs[2]);
System.out.println("joinStr = " + joinStr);
//joiner 还可以连接对象,这种情况下 会调用对象的toString方法,将对象转换为String
}

Joiner

/* CharMatcher 默认常量实现类:
* ANY: 匹配任何字符
* ASCII: 匹配是否是ASCII字符
* BREAKING_WHITESPACE: 匹配所有可换行的空白字符(不包括非换行空白字符,例如"\u00a0")
* DIGIT: 匹配ASCII数字
* INVISIBLE: 匹配所有看不见的字符
* JAVA_DIGIT: 匹配UNICODE数字, 使用 Character.isDigit() 实现
* JAVA_ISO_CONTROL: 匹配ISO控制字符, 使用 Charater.isISOControl() 实现
* JAVA_LETTER: 匹配字母, 使用 Charater.isLetter() 实现
* JAVA_LETTER_OR_DIGET: 匹配数字或字母
* JAVA_LOWER_CASE: 匹配小写
* JAVA_UPPER_CASE: 匹配大写
* NONE: 不匹配所有字符
* SINGLE_WIDTH: 匹配单字宽字符, 如中文字就是双字宽
* WHITESPACE: 匹配所有空白字符
*
* 常用操作方法:
* 修剪[trim]、折叠[collapse]、移除[remove]、保留[retain]
* CharMatcher is(char match): 返回匹配指定字符的Matcher
* CharMatcher isNot(char match): 返回不匹配指定字符的Matcher
* CharMatcher anyOf(CharSequence sequence): 返回匹配sequence中任意字符的Matcher
* CharMatcher noneOf(CharSequence sequence): 返回不匹配sequence中任何一个字符的Matcher
* CharMatcher inRange(char startInclusive, char endIncludesive): 返回匹配范围内任意字符的Matcher
* CharMatcher forPredicate(Predicate<? super Charater> predicate): 返回使用predicate的apply()判断匹配的Matcher
* CharMatcher negate(): 返回以当前Matcher判断规则相反的Matcher
* CharMatcher and(CharMatcher other): 返回与other匹配条件组合做与来判断的Matcher
* CharMatcher or(CharMatcher other): 返回与other匹配条件组合做或来判断的Matcher
* boolean matchesAnyOf(CharSequence sequence): 只要sequence中有任意字符能匹配Matcher,返回true
* boolean matchesAllOf(CharSequence sequence): sequence中所有字符都能匹配Matcher,返回true
* boolean matchesNoneOf(CharSequence sequence): sequence中所有字符都不能匹配Matcher,返回true
* int indexIn(CharSequence sequence): 返回sequence中匹配到的第一个字符的坐标
* int indexIn(CharSequence sequence, int start): 返回从start开始,在sequence中匹配到的第一个字符的坐标
* int lastIndexIn(CharSequence sequence): 返回sequence中最后一次匹配到的字符的坐标
* int countIn(CharSequence sequence): 返回sequence中匹配到的字符计数
* String removeFrom(CharSequence sequence): 删除sequence中匹配到到的字符并返回
* String retainFrom(CharSequence sequence): 保留sequence中匹配到的字符并返回
* String replaceFrom(CharSequence sequence, char replacement): 替换sequence中匹配到的字符并返回
* String trimFrom(CharSequence sequence): 删除首尾匹配到的字符并返回
* String trimLeadingFrom(CharSequence sequence): 删除首部匹配到的字符
* String trimTrailingFrom(CharSequence sequence): 删除尾部匹配到的字符
* String collapseFrom(CharSequence sequence, char replacement): 将匹配到的组(连续匹配的字符)替换成replacement
* String trimAndCollapseFrom(CharSequence sequence, char replacement): 先trim在replace
* */

匹配器及常用方法

@Test
public void testSplitter(){
String str = ",b,c,d,,f,";
//JDK会自动丢掉最后一个分隔符 且 中间的无论是什么,都作为一个元素 放到数组中
String[] strs = str.split(",");
for(String s:strs){
System.out.println("JDK-split:" + s + "-");
}
System.out.println("----------------------------");
//Guava 提供了更多的可供选择的模式
Iterable<String> iterable = Splitter.on(",")
.trimResults() //去除元素中的前导空格和后导空格
.omitEmptyStrings() //省略空字符串
.limit(3) //限制拆分元素的数量 前 n-1个正常拆分,最后的全部的作为1个元素,共拆出n个元素
.split(str);
Iterator<String> iterator = iterable.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + "-" );
System.out.println();
}
//正则表达式匹配拆分
System.out.println("--------------正则表达式--------------");
String patternStr = "abc12def34ffg78jip";
Iterable<String> iterable2 = Splitter.onPattern("[0-9]").split(patternStr);
Iterator<String> iterator2 = iterable2.iterator();
while (iterator2.hasNext()) {
System.out.print(iterator2.next() + "&" );
}
System.out.println();
System.out.println("----------------------------");
//拆分器返回List
ArrayList<String> list = Lists.newArrayList(
iterable);
System.out.println(list.get(0) + "-" + list.get(1));
//数字匹配器
String matchStr = "ab12c*(3de45你好jio:潘腾jA@#B6%7fC^&";
System.out.println("保留数字:" + CharMatcher.DIGIT.retainFrom(matchStr));//保留所有数字
System.out.println("去除数字:" + CharMatcher.DIGIT.removeFrom(matchStr));
System.out.println("数字替换:" + CharMatcher.DIGIT.replaceFrom(matchStr,"*"));
//大写字母匹配器
System.out.println("获取所有大写字母:" + CharMatcher.JAVA_UPPER_CASE.retainFrom(matchStr));
//单字节匹配器(汉字是双字节)
System.out.println("去除单字节,获取双字节:" + CharMatcher.SINGLE_WIDTH.removeFrom(matchStr));

拆分 + 匹配器示例程序

2、集合

  不可变集合:优点-线程安全,不需要考虑变化,节省空间和时间,效率高

  注意:不可变集合不允许有null对象

/**
* 测试不可变集合
* @method: testImmutableSet() -by fjt
* @TODO: void
*/
@Test
public void testImmutableSet(){
List<String> list = new ArrayList<String>(Arrays.asList("black","white","red","blue"));
Map<String, String> map = new TreeMap<>();
map.put("id", "20111907");
map.put("name", "panteng");
//创建的三种方式copyOf of Builder方法
//ImmutableList<String> finalList = ImmutableList.copyOf(list);
ImmutableList<String> finalList = ImmutableList.of("black","white","red","blue");//括号内写 list变量 会报错
try{
//finalList.add("yellow"); //抛出空指针异常
//finalList.remove(0); //抛出空指针异常
}catch(Exception ex){
System.out.println("List 异常信息:" + ex.getMessage());
} ImmutableMap<String, String> finalMap = ImmutableMap.copyOf(map);
try{
System.out.println(finalMap.get("name"));
finalMap.put("aa", "abcd"); //报异常
}catch(Exception ex){
System.out.println("Map 异常信息:" + ex.getMessage());
}
/** 不可变集合类型
* ImmutableCollection
* ImmutableList
* ImmutableSet
* ImmutableSortedSet
* ImmutableMap
* ImmutableSortedMap
* ImmutableMultiset
* ImmutableSortedMultiset
* ImmutableMultimap
* ImmutableListMultimap
* ImmutableSetMultimap
* ImmutableBiMap
* ImmutableClassToInstanceMap
* ImmutableTable
*/
}

不可变集合

  可重复元素的集合,可以将元素看为key,value为出现次数,用于统计。

 /**
* 1. 可以将MultiSet看成map, 作为计数器,key 为元素,值为计数器
* 2.
*/
@Test
public void testMultiSet(){
Multiset<String> multisets = HashMultiset.create();
String[] strArray = new String[]{"one","one","two","three"}; //添加元素
multisets.addAll(Arrays.asList(strArray));
multisets.add("four"); //添加指定个数的元素
multisets.add("five", 3);
//[two, five x 3, one x 2, three, four]
System.out.println("打印multiset:" + multisets);
//返回元素总个数
System.out.println("元素总个数:" + multisets.size()); //遍历
Iterator<String> iterator = multisets.iterator();
//two,five,five,five,one,one,three,four,
while(iterator.hasNext()){
System.out.print(iterator.next() + ",");
}
System.out.println();
Set<Entry<String>> entitySet = multisets.entrySet();//?????
System.out.println("???" + entitySet); //返回给定元素的个数
System.out.println("返回指定元素的重复次数:" + multisets.count("one")); //移除某元素的一个
multisets.remove("one");
System.out.println("移除后:" + multisets.count("one"));
//移除某元素的所有
multisets.setCount("one",0);
System.out.println("移除one所有后:" + multisets); //将不同元素放入一个Set
Set<String> uniqueSet = multisets.elementSet();
System.out.println("不同元素放入一个SET:" + uniqueSet); //设定一个元素的重复次数
multisets.setCount("three", 3);
System.out.println("打印multiset:" + multisets); }

可重复集合

  MultiMap - 一个key可以对应多个值,可以认为是一个key对应一个集合,解决一对多的问题

 @Test
/**
* ArrayListMultimap
HashMultimap
LinkedListMultimap*
LinkedHashMultimap**
TreeMultimap
ImmutableListMultimap
ImmutableSetMultimap
*/
public void testMultiMap(){
Multimap<String, String> mutimap = HashMultimap.create();
mutimap.put("father_a", "son_a1");
mutimap.put("father_a", "son_a2");
mutimap.put("father_a", "son_a3"); mutimap.put("father_b", "son_b1");
mutimap.put("father_b", "son_b2");
mutimap.put("father_b", "son_b3"); //{father_a=[son_a1, son_a3, son_a2], father_b=[son_b3, son_b2, son_b1]}
System.out.println("mutimap = " + mutimap); //整体添加
ArrayList<String> father_c = new ArrayList<String>();
father_c.add("son_C1");
father_c.add("son_C2");
mutimap.putAll("father_c", father_c); //获取某个key对应的元素
Collection<String> father_a = mutimap.get("father_c");
Iterator<String> iterator = father_a.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + ",");
}
System.out.println(); //获取键值
System.out.println("获取所有的键值:" + mutimap.keySet()); //
}

一对多

  双向Map,即可以通过key获取value  也可以很容易的通过value获取key  实现一对一的关系;需要注意的是,必须保证值是唯一的

 /**
* 实际上是调用反转方法 获取到一个新的Map
*/
@Test
public void testBiMap(){
Map<String, String> genMap = new HashMap<String, String>();
genMap.put("one", "1");
genMap.put("two", "2");
genMap.put("three", "3");
BiMap<String, String> twoDirectMap = HashBiMap.create();
twoDirectMap.putAll(genMap);
System.out.println("one = " + twoDirectMap.get("one"));
System.out.println("1 = " + twoDirectMap.get("1")); //获取反转Map
BiMap<String, String> twoDirectMap_mirror = twoDirectMap.inverse();
System.out.println("one = " + twoDirectMap_mirror.get("one"));
System.out.println("1 = " + twoDirectMap_mirror.get("1")); }

双向Map

Guava API的更多相关文章

  1. guava API整理

    1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection API Guava Basic Utilities IO API C ...

  2. 基于Guava API实现异步通知和事件回调

    本文节选自<设计模式就该这样学> 1 基于Java API实现通知机制 当小伙伴们在社区提问时,如果有设置指定用户回答,则对应的用户就会收到邮件通知,这就是观察者模式的一种应用场景.有些小 ...

  3. Guava API学习之Multimap

    相信大家对Java中的Map类及其之类有大致的了解,Map类是以键值对的形式来存储元素(Key->Value),但是熟悉Map的人都知 道,Map中存储的Key是唯一的.什么意思呢?就是假如我们 ...

  4. Guava API学习之Preconditions优雅的检验参数 编辑

    在日常开发中,我们经常会对方法的输入参数做一些数据格式上的验证,以便保证方法能够按照正常流程执行下去.对于可预知的一些数据上的错误,我们一定要做 事前检测和判断,来避免程序流程出错,而不是完全通过错误 ...

  5. Guava API学习之Ordering犀利的比较器 编辑

    Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强.它非常容易扩展,可以轻松构造复杂的comparator,然后用在 ...

  6. Guava API学习之Optional 判断对象是否为null

    java.lang.NullPointerException,只要敢自称Java程序员,那对这个异常就再熟悉不过了.为了防止抛出这个异常,我们经常会写出这样的代码: Person person = p ...

  7. Guava API - FluentIterable Predicate Function Odering Range Splitter

    这写API可解决的问题 1. 集合元素的过滤 - FluentIterable Predicate Range Function 1) 先说Predicate<T>,这个相当与一个过滤原则 ...

  8. guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用

    guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...

  9. 瓜娃《guava》api快速入门

    1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection API Guava Basic Utilities IO API C ...

随机推荐

  1. [妙味JS基础]第十课:日期对象、时钟倒计时

    知识点总结 时间.年.月.日.时.分.秒 new Date() ->当前系统的时间对象 数字类型: getFullYear().getYear().getUTCFullYear() getYea ...

  2. 《JS权威指南学习总结--7.10 数组类型》

    内容要点: 一.数组类型 判断它是否为数组通常非常有用.在ES5中,可以使用Array.isArray()函数来做这件事情: Array.isArray([]); //=>true Array. ...

  3. 解决IOS下不支持fixed的问题

    我们公司有一个页面底部用到了fixed样式,每当弹出键盘的时候,IOS下fixed就会走样(据我所知android没有该问题). 为此之前我经过产品的同意做了简单的处理(方法1). 方法一: focu ...

  4. 图的存储结构:邻接矩阵(邻接表)&链式前向星

    [概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组gr ...

  5. Windows系统新建gitignore文件出现“必须键入文件名”错误的解决办法

    今天打算把本地的项目用git推送到github上去,但是有的信息我又不想把它加入到版本控制系统中去,例如.classpath文件和.class文件等等,这个时候我就想到了使用.gitignore文件把 ...

  6. HDU 1264 Counting Squares(模拟)

    题目链接 Problem Description Your input is a series of rectangles, one per line. Each rectangle is speci ...

  7. Gym 100553B Burrito King 无脑背包

    题意就是你有n和m两个上限 吃一个东西会同时增加两个东西 m的值不能超过给定的m 问最后的n m值和每个东西吃了多少 贪心一下就好了 算一下性价比 从最大的开始吃 直到吃满了m n也一定是最大了 只是 ...

  8. GetLastError() 返回值含义

    [0]-操作成功完成.[1]-功能错误.[2]-系统找不到指定的文件.[3]-系统找不到指定的路径.[4]-系统无法打开文件.[5]-拒绝访问.[6]-句柄无效.[7]-存储控制块被损坏.[8]-存储 ...

  9. CentOS系统更换软件安装源aliyun的

    CentOS系统更换软件安装源第一步:备份你的原镜像文件,以免出错后可以恢复. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS ...

  10. Table获取checkbox选中行数据

    //检测勾选值 function checkEnter() { var Ivalue = ""; $("#dataTable tr").each(functio ...