欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-12 18:45:42
新增日期类&正则表达式&泛型&迭代器&比较器& 基于Pinyin4J实现中文排序目录:LocalDateTime & DateTimeFormatter & Pattern & Matcher & 泛型 & Collection接口 & List & 迭代器(Iterator) & Comparator(比较器) & 基于Pinyin4J实现中文排序 & MapLocalDate//...

新增日期类&正则表达式&泛型&迭代器&比较器& 基于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一样,不允许空键值存在,实现线程同步的实现,运行效率较低

本文地址:https://blog.csdn.net/weixin_47255857/article/details/107283357