1、字符串的处理

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

  Joiner&Splitter

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

Joiner

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

匹配器及常用方法

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

拆分 + 匹配器示例程序

2、集合

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

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

  1. /**
  2. * 测试不可变集合
  3. * @method: testImmutableSet() -by fjt
  4. * @TODO: void
  5. */
  6. @Test
  7. public void testImmutableSet(){
  8. List<String> list = new ArrayList<String>(Arrays.asList("black","white","red","blue"));
  9. Map<String, String> map = new TreeMap<>();
  10. map.put("id", "20111907");
  11. map.put("name", "panteng");
  12. //创建的三种方式copyOf of Builder方法
  13. //ImmutableList<String> finalList = ImmutableList.copyOf(list);
  14. ImmutableList<String> finalList = ImmutableList.of("black","white","red","blue");//括号内写 list变量 会报错
  15. try{
  16. //finalList.add("yellow"); //抛出空指针异常
  17. //finalList.remove(0); //抛出空指针异常
  18. }catch(Exception ex){
  19. System.out.println("List 异常信息:" + ex.getMessage());
  20. }
  21.  
  22. ImmutableMap<String, String> finalMap = ImmutableMap.copyOf(map);
  23. try{
  24. System.out.println(finalMap.get("name"));
  25. finalMap.put("aa", "abcd"); //报异常
  26. }catch(Exception ex){
  27. System.out.println("Map 异常信息:" + ex.getMessage());
  28. }
  29. /** 不可变集合类型
  30. * ImmutableCollection
  31. * ImmutableList
  32. * ImmutableSet
  33. * ImmutableSortedSet
  34. * ImmutableMap
  35. * ImmutableSortedMap
  36. * ImmutableMultiset
  37. * ImmutableSortedMultiset
  38. * ImmutableMultimap
  39. * ImmutableListMultimap
  40. * ImmutableSetMultimap
  41. * ImmutableBiMap
  42. * ImmutableClassToInstanceMap
  43. * ImmutableTable
  44. */
  45. }

不可变集合

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

  1. /**
  2. * 1. 可以将MultiSet看成map, 作为计数器,key 为元素,值为计数器
  3. * 2.
  4. */
  5. @Test
  6. public void testMultiSet(){
  7. Multiset<String> multisets = HashMultiset.create();
  8. String[] strArray = new String[]{"one","one","two","three"};
  9.  
  10. //添加元素
  11. multisets.addAll(Arrays.asList(strArray));
  12. multisets.add("four");
  13.  
  14. //添加指定个数的元素
  15. multisets.add("five", 3);
  16. //[two, five x 3, one x 2, three, four]
  17. System.out.println("打印multiset:" + multisets);
  18. //返回元素总个数
  19. System.out.println("元素总个数:" + multisets.size());
  20.  
  21. //遍历
  22. Iterator<String> iterator = multisets.iterator();
  23. //two,five,five,five,one,one,three,four,
  24. while(iterator.hasNext()){
  25. System.out.print(iterator.next() + ",");
  26. }
  27. System.out.println();
  28. Set<Entry<String>> entitySet = multisets.entrySet();//?????
  29. System.out.println("???" + entitySet);
  30.  
  31. //返回给定元素的个数
  32. System.out.println("返回指定元素的重复次数:" + multisets.count("one"));
  33.  
  34. //移除某元素的一个
  35. multisets.remove("one");
  36. System.out.println("移除后:" + multisets.count("one"));
  37. //移除某元素的所有
  38. multisets.setCount("one",0);
  39. System.out.println("移除one所有后:" + multisets);
  40.  
  41. //将不同元素放入一个Set
  42. Set<String> uniqueSet = multisets.elementSet();
  43. System.out.println("不同元素放入一个SET:" + uniqueSet);
  44.  
  45. //设定一个元素的重复次数
  46. multisets.setCount("three", 3);
  47. System.out.println("打印multiset:" + multisets);
  48.  
  49. }

可重复集合

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

  1. @Test
  2. /**
  3. * ArrayListMultimap
  4. HashMultimap
  5. LinkedListMultimap*
  6. LinkedHashMultimap**
  7. TreeMultimap
  8. ImmutableListMultimap
  9. ImmutableSetMultimap
  10. */
  11. public void testMultiMap(){
  12. Multimap<String, String> mutimap = HashMultimap.create();
  13. mutimap.put("father_a", "son_a1");
  14. mutimap.put("father_a", "son_a2");
  15. mutimap.put("father_a", "son_a3");
  16.  
  17. mutimap.put("father_b", "son_b1");
  18. mutimap.put("father_b", "son_b2");
  19. mutimap.put("father_b", "son_b3");
  20.  
  21. //{father_a=[son_a1, son_a3, son_a2], father_b=[son_b3, son_b2, son_b1]}
  22. System.out.println("mutimap = " + mutimap);
  23.  
  24. //整体添加
  25. ArrayList<String> father_c = new ArrayList<String>();
  26. father_c.add("son_C1");
  27. father_c.add("son_C2");
  28. mutimap.putAll("father_c", father_c);
  29.  
  30. //获取某个key对应的元素
  31. Collection<String> father_a = mutimap.get("father_c");
  32. Iterator<String> iterator = father_a.iterator();
  33. while (iterator.hasNext()) {
  34. System.out.print(iterator.next() + ",");
  35. }
  36. System.out.println();
  37.  
  38. //获取键值
  39. System.out.println("获取所有的键值:" + mutimap.keySet());
  40.  
  41. //
  42. }

一对多

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

  1. /**
  2. * 实际上是调用反转方法 获取到一个新的Map
  3. */
  4. @Test
  5. public void testBiMap(){
  6. Map<String, String> genMap = new HashMap<String, String>();
  7. genMap.put("one", "1");
  8. genMap.put("two", "2");
  9. genMap.put("three", "3");
  10. BiMap<String, String> twoDirectMap = HashBiMap.create();
  11. twoDirectMap.putAll(genMap);
  12. System.out.println("one = " + twoDirectMap.get("one"));
  13. System.out.println("1 = " + twoDirectMap.get("1"));
  14.  
  15. //获取反转Map
  16. BiMap<String, String> twoDirectMap_mirror = twoDirectMap.inverse();
  17. System.out.println("one = " + twoDirectMap_mirror.get("one"));
  18. System.out.println("1 = " + twoDirectMap_mirror.get("1"));
  19.  
  20. }

双向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. iOS开发自定义流水布局

    //集成UICollectionViewFlowLayout 自己写的布局 //  SJBFlowLayout.m //  自定义流水布局 // //  Created by zyyt on 16/7 ...

  2. JQuery:以name为条件查找

    例如:$(":input[name='keleyi']") 表示查找的是name为keleyi的表单. var a=$(t).prev(":input[name='dis ...

  3. 《Javascript网页经典特性300例》

    <Javascript网页经典特性300例> 基础篇 第1章:网页特性 刷新.后退.前进.关闭.标题.跳转禁止网页放入框架动态加载js避免浏览器使用缓存加载页面 第2章:DOM操作 根据n ...

  4. 2016年团体程序设计天梯赛-决赛 L1-3. 出租(20)

    下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声,急问这个怎么破.其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对 ...

  5. ggplot2 scale相关设置2—时间设置

    在scale设置中,常用的日期方面的设置函数包括: scale_x_date(),scale_y_date(),scale_x_datetime(),scale_y_datetime()   接下来, ...

  6. POJ 3041 Asteroids(匈牙利+邻接表)

    ( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<cstring> #include<algo ...

  7. Implementing a builder: Combine

    原文地址:点击这里 本篇我们继续讨论从一个使用Combine方法的computation expression中返回多值. 前面的故事 到现在为止,我们的表达式建造(builder)类如下 type ...

  8. [转]简述负载均衡和CDN技术

    http://blog.jobbole.com/86066/ 曾经见到知乎上有人问“为什么像facebook这类的网站需要上千个工程师维护?”,下面的回答多种多样,但总结起来就是:一个高性能的web系 ...

  9. hdu 1407 测试你是否和LTC水平一样高

    Description 大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目,我敢保证你和他绝对在一个水平线上! 你的任务是: 计算方程x^2+y^2+z^2= num的一个正整数解.  Inpu ...

  10. (转载)html dom节点操作(获取/修改/添加或删除)

    DOM 是关于如何获取.修改.添加或删除 HTML 元素的标准,下面为大家介绍下html dom节点操作,感兴趣的朋友可以参考下   HTML DOM 是关于如何获取.修改.添加或删除 HTML 元素 ...