知识梳理(新增日期类&正则表达式&泛型&迭代器&比较器& 基于Pinyin4J实现中文排序)

  时间:2020-07-12 11:22:36  阅读量:455  评论数:0  作者:yizouua

这篇文章详细介绍了知识梳理(新增日期类&正则表达式&泛型&迭代器&比较器&基于Pinyin4J实现中文排序),文中穿插有实例代码和示例程序介绍的很详细,遇到同样问题的朋友可以参考一下,如果有更好的解决方法,请留言分享帮助更多的程序员。

新增日期类&正则表达式&泛型&迭代器&比较器& 基于Pinyin4J实现中文排序

目录:LocalDateTime & DateTimeFormatter & Pattern & Matcher & 泛型 & Collection接口 & List & 迭代器(Iterator) & Comparator(比较器) & 基于Pinyin4J实现中文排序 & Map

LocalDate

//获取当前系统时间所表示的日期对象
LocalDate date = LocalDate.now();
//获取月份值(年周日同理)
Date.getMonthValue();
//根据指定的日期构建一个LocalDate对象
LocalDate date2 = LocalDate.of(2020,7,8);

LocalTime

//获取当前系统时间所表示的日期对象
LocalTime time = LocalTime.now();
//获取时(分秒)
time.getHour();
//根据指定的日期构建一个LocalTime对象
LocalTime time = LocalDate.of(12,11,18);

LocalDateTime

//获取当前系统时间所表示的日期对象
LocalDateTime time = LocalDateTime.now();
//根据指定的日期构建一个LocalDateTime对象
LocalDateTime time = LocalDateTime.of(2020,8,9,19,22,12);
//将LocalDateTime转换为LocalDate跟LocalTime
LocalDate localDate = time.toLocalDate();
LocalTime localTime = time.toLocalTime();

DateTimeFormatter

//创建一个格式化解析对象
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
//获取系统时间
LocalDateTime datetime = LocalDateTime.now();

//将datetime格式转成2020年07月……的形式
String time = fmt.format(datetime);
time = datetime.format(fmt);

//将2020年07月……的String类型转成DateTime
String t = "2020年07月08日 09时33分21秒"; 
dateTime = LocalDateTime.parse(t, fmt);

注意事项:

与DateFormat和SimpleDateFormat的区别在于,DateTimeFormatter是线程安全的实现,在多线程并发的时候可以让多个线程使用同一当前实例,能保证数据的一致性;但是DateFormat是线程非安全实现,因此在多线程并发时,需要为每个线程单独创建该实例。

Pattern & Matcher

  • Pattern :提供针对正则表达式的编译功能
  • Matcher:提供对已经编译过的正则表达式匹配字符串的功能
//Pattern & Matcher 用法:
String s = "234798273489176123123123";
Pattern p = Pattern.compile("1\\d{10}");
Matcher m = p.matcher(s);
//如果成功查找 m.find() 返回值为true
while(m.find()){
    System.out.println(m.group());
}

泛型(Generic)

在类声明时在后面通过<>符号指定类型参数,然后在类中可以使用这些类型参数设置动态类型

public class MyCalc<I,D,F> {
    public I add(I i1,I i2) {
		return null;
	}
    ...
}
public interface BaseManager<T> {

	boolean add(T obj);
	
	boolean delete(T obj);
	
	boolean update(T obj);
	
	T findById(int id);
	
	ArrayList<T> findAll();
}
//接口后接<T>,在实现类中要加具体类<Emp>
public class EmpManager implements BaseManager<Emp>{
    ...
}

Collection接口

是java集合框架中的顶层接口,用于表示一些相同类型的数据集合,内部提供了一系列用于对集合中元素进行存储的方法。

Collection接口的常见方法;

  • add(E e) 添加元素
  • addAll(Collection<? extends E> c) 添加一个集合到当前集合中
  • clear() 从集合中删除所有的元素
  • contains(Object obj) 判断集合中是否包含指定的元素
  • isEmpty() 判断集合是否为空
  • remove(Object o) 删除指定的元素
  • removeAll(Collection<?> c) 删除指定的集合
  • size() 获取集合中元素的个数
  • toArray() 将集合中的所有元素转换为数组
  • iterator() 返回集合中的元素的迭代器

List

List是从Collection继承过来,也是一个接口;List扩展自Collection,在Collection基础上新增了一些方法:

  • get(int index) 根据索引获取元素
  • set(int index,E e) 向指定的位置插入元素
  • remove(int index) 删除指定索引处的元素
  • listIterator() 获取一个列表迭代器(有序)

由于List是一个接口,所以没法直接实例化,因此JDK中提供了一些对于List接口实现的实现类:

  • ArrayList:线程不安全(不同步)
  • LinkedList:基于链表的List实现

迭代器(Iterator)

迭代器即游标,将集合处理为类似栈结构的数据结构,通过栈顶指针依次向下搜索元素,直到达到栈底为止

//获取当前集合对象的迭代器(游标)
List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while(it.hasNext()) {			
    String s = it.next();
    if(s.equals("30")) {
        it.remove();
    }
    System.out.println(s);
}

Comparator

定义比较器(MyComparator)

//创建一个MyComparator类
public class MyComparator implements Comparator<String>{
	@Override
	public int compare(String s1, String s2) {
		return s1.compareTo(s2);
	}
}
//对数组进行排序
list.sort(new MyComparator());
//匿名内部类使用方法
list.sort(new Comparator<Student>() {
    @Override
    public int compare(Student s1, Student s2) {
        return s1.getAge() - s2.getAge();
});

如果被添加到TreeSet中的元素没有实现Comparable接口也可以,此时只需要在创建TreeSet时通过以下构造器,传入排序比较器对象即可:

//User无需实现Comparable接口
//构造TreeSet时传入排序比较器
Set<User> set = new TreeSet<>(
(u1,u2)->u1.getId()-u2.getId());

基于Pinyin4J实现中文排序

对中文内容排序需要使用到一个开源插件(jar包)-Pinyin4j

  • pinyin4j-2.5.0.jar
中文排序示例:
List<String> names = new ArrayList<>();
names.add("柴老师");
names.add("王老师");
names.add("苍老师");
names.add("老王");
names.add("老李");
names.add("小泽老师");

Collections.sort(names,(s1,s2)->{

    String p1 = "";
    String p2 = "";
    for(int i = 0;i<s1.length();i  ) {
        p1  = PinyinHelper.toHanyuPinyinStringArray(s1.charAt(i))[0];
    }
    for(int i = 0;i<s2.length();i  ) {
        p2  = PinyinHelper.toHanyuPinyinStringArray(s2.charAt(i))[0];
    }
    return p1.compareTo(p2);
});

System.out.println(names);

Set

Set集合也是从Collection扩展而来的子集合,相比List集合来说,Set集合内部存储的数据不是按照添加顺序存储,内部不允许出现重复的元素(不允许出现e1.equals(e2)),对null也只允许出现一个,对于set集合常用的实现主要有以下:

  • HashSet(哈希表-散列表)
  • TreeSet(二叉树-红黑树)
  • LinkedHashSet

HashSet

//创建
Set<String> set = new HashSet<String>();
//获取set集合的迭代器
Iterator<String> it = set.iterator();
while(it.hasNext()) {
    String s = it.next();
    System.out.println(s);
    if(s.equals("lily")) {

TreeSet

当多个用户的id一致时,TreeSet会根据compareTo方法判定元素为重复,此时会去除重复

注意事项:

  1. 由于Set集合存储元素的”无序“(不按照添加顺序存储),因此元素没有索引的概念,在获取元素的时候只能通过迭代器迭代。
  2. HashSet和TreeSet区别
    1. HashSet是基于哈希表的实现,元素的存储顺序也是按照哈希地址排序,因此是否重复由哈希值确定
    2. TreeSet是基于二叉树-红黑树实现,元素的存储顺序根据元素实现的Comparable接口中的comparaTo方法的实现排序,是否重复也是根据排序值判定
  3. TreeSet使用要求:
    1. 集合中元素必须是同一种数据类型
    2. 要么让内部元素实现Comparable接口,要么创建TreeSet时提供排序比较器(Comparator)

Map(映射)

//获取value值
map.get("id")//foreach遍历
Set<Long> keys = map.keySet();
for (Long l : keys) {
System.out.println(map.get("id").toString());
}

TreeMap

//创建存储数据
Map<Stuent, String> map = new TreeMap<>();
map.put(new Student(), "vaen");
//创建并附加比较器
Map<Stu, Object> map2 = new TreeMap<Stuent, String>(new Comparator<Stu>{
	public int compara(Stu s1,Stu s2){
	return s1.getAge() - s2.getAge();
	}
});

HashMap、Hashtable、TreeMap的区别

  1. HashMap是基于hash算法的实现,内不通过数组结合链表实现,允许空键值存在,是线程不同步的实现
  2. TreeMap是基于红黑树的实现,内部元素的存储顺序是由自然顺序对键进行排序之后存储,是线程不同步的实现
  3. Hashtable是从老式的Dictionary类继承而来,内部的实现原理跟HashMap一样,不允许空键值存在,实现线程同步的实现,运行效率较低

关键词:java,eclipse,知识,梳理,新增,日期,正则,正则表达式,表达,表达式,泛型,迭代,迭代器,比较,比较器,基于,实现,中文,排序


相关标签/搜索

java培训java是什么javascriptjava面试题及答案2020javascript什么意思eclipse安装教程eclipse字体大小设置eclipse怎么导入项目eclipse左边的栏怎么恢复eclipse使用教程知识付费知识产权知识的拼音基础知识不扎实的评语基础知识掌握不牢固怎么写评语梳理是什么意思梳理的拼音梳理机梳理与疏理的区别梳理的近义词css3新增的属性新增新型肺炎病例69例新增病例最新消息新增2个高风险地区新增确诊日期计算器日期下载日期章本月拍牌日期日期农历正则表达式正则体育学院正则什么意思正则学院正则表达式语法正则表达式匹配字符串正则表达式生成器正则表达式匹配数字正则表达式\dlambda表达式lambda表达式pythonlambda表达式 javalambda表达式中可以使用任意复杂lambda表达式解释性良好反射机制可以获取泛型的具体类型泛型 java泛型方法的定义和使用泛型的作用泛型擦除迭代什么意思迭代怎么读迭代法迭代器iterator迭代器是什么迭代器遍历list集合迭代器模式列表迭代器字符串比较大小女程序员转行做什么比较好用作比较的说明方法写一种事物用作比较的说明方法造句用作比较的方法介绍一种事物基于是什么意思基于matlab的车牌识别系统基于ceni网络和信息基础设施web服务是基于哪个协议基于结果的校本研修计划中的结果指的是多线程的实现方式实现中华民族伟大复兴的中国梦实现全体人民共同富裕的宏伟目标最终靠的是实现英语实现中国梦必须github官网切换中文input是什么意思中文vscode设置中文ddd是什么意思中文booty music 中文歌词拓扑排序快速排序算法快速排序图解快速排序时间复杂度快速排序在最坏情况下的时间复杂度为