String忽略大小写方法compareToIgnoreCase源码及Comparator自定义比较器
String忽略大小写方法compareToIgnoreCase源码及Comparator自定义比较器
//源码
public int compareToIgnoreCase(String str) {
return CASE_INSENSITIVE_ORDER.compare(this, str);
} /**
* A Comparator that orders {@code String} objects as by
* {@code compareToIgnoreCase}. This comparator is serializable.
* <p>
* Note that this Comparator does <em>not</em> take locale into account,
* and will result in an unsatisfactory ordering for certain locales.
* The java.text package provides <em>Collators</em> to allow
* locale-sensitive ordering.
*
* @see java.text.Collator#compare(String, String)
* @since 1.2
*/
public static final Comparator<String> CASE_INSENSITIVE_ORDER
= new CaseInsensitiveComparator();
private static class CaseInsensitiveComparator
implements Comparator<String>, java.io.Serializable {
// use serialVersionUID from JDK 1.2.2 for interoperability
private static final long serialVersionUID = 8575799808933029326L; public int compare(String s1, String s2) {
int n1 = s1.length();
int n2 = s2.length();
int min = Math.min(n1, n2);
for (int i = 0; i < min; i++) {
char c1 = s1.charAt(i);
char c2 = s2.charAt(i);
if (c1 != c2) {
c1 = Character.toUpperCase(c1);
c2 = Character.toUpperCase(c2);
if (c1 != c2) {
c1 = Character.toLowerCase(c1);
c2 = Character.toLowerCase(c2);
if (c1 != c2) {
// No overflow because of numeric promotion
return c1 - c2;
}
}
}
}
return n1 - n2;
} /** Replaces the de-serialized object. */
private Object readResolve() { return CASE_INSENSITIVE_ORDER; }
}
对于设置的比较器的升序和降序问题的解释
public interface Comparator<T>{
int compare(T first, T second);
}
通过计算两个字符串,如果第一个参数大于第二个参数,则返回一个正数,反之则返回一个负数
当返回结果为负数时,表示不需要交换两个参数的位置
当返回结果为正数时,表示需要交换两个参数的位置
而当数组进行排序时,从前往后传入两个参数,传入无非两种情况:
第一个参数大于第二个参数–>返回值为正数–>交换两个参数
第一个参数小于第二个参数–>返回值为负数–>不交换两个参数
我们会发现,这两种结果其实都指向一个相同的结论,就是执行完都会使得第一个参数小于第二个参数,故符合开始的结论:return first.a - second.a表示按升序排序
那么自然如果return second.a -first.a则表示按降序排序。
//DEMO
public class Student implements Comparable<Student>{
/**
* 姓名
*/
private String username;
/**
* 年龄
*/
private int age; public Student() {
super();
}
public Student(String username, int age) {
this.username = username;
this.age = age;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public int compareTo(Student o) {
return this.age-o.age;//升序
}
} package com.example.core.mydemo.json; import com.alibaba.fastjson.JSON;
import com.example.core.mydemo.json.vo.Student; import java.util.*;
import java.util.stream.Collectors; public class ComparatorTest { public static void main(String[] args) {
Student s1 = new Student("Aliming",8);
Student s2 = new Student("ajiaqi",9);
Student s3 = new Student("Bruixing",7);
Student s4 = new Student("bzeyi",7);
List<Student> list = new ArrayList();
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4); int size = list.size();
List<String> listTmp = list.stream().map(Student::getUsername).collect(Collectors.toList());
String [] arrayToSort = listTmp.toArray(new String[size]);
// Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER); //忽略大小写
Arrays.sort(arrayToSort); //默认是区分大小写 /**
* 区分大小写
* 排序1:Aliming
* 排序1:Bruixing
* 排序1:ajiaqi
* 排序1:bzeyi
*
*
* 忽略大小写
* 排序1:ajiaqi
* 排序1:Aliming
* 排序1:Bruixing
* 排序1:bzeyi
*
*/
for(int i = 0; i < size; i ++) {
System.out.println(" 排序1:" + arrayToSort[i]);
} List<String> featureSort = listTmp.stream().sorted((a,b) -> (a.compareToIgnoreCase(b))).collect(Collectors.toList());
for(int i = 0; i < size; i ++) {
System.out.println(" 排序2:" + arrayToSort[i]);
} Collections.sort(list, new Comparator<Student>() {//比较器
@Override
public int compare(Student o1, Student o2) {
// return o2.getAge()-o1.getAge();//以学生的年龄降序
return o1.getAge()-o2.getAge();//以学生的年龄升序
}
});
/**
* 排序3:{"age":7,"username":"Bruixing"}
* 排序3:{"age":7,"username":"bzeyi"}
* 排序3:{"age":8,"username":"Aliming"}
* 排序3:{"age":9,"username":"ajiaqi"}
*/
for (int i = 0; i < list.size(); i++) {
System.out.println("排序3:" + JSON.toJSONString(list.get(i)));
} Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// 年龄降序
int result = o2.getAge()-o1.getAge();//年龄降序 if(result==0){//第一个规则判断完了 下一个规则 姓名的首字母 升序
result = o1.getUsername().charAt(0)-o2.getUsername().charAt(0);
} return result;
}
});
/**
* 排序4:{"age":9,"username":"ajiaqi"}
* 排序4:{"age":8,"username":"Aliming"}
* 排序4:{"age":7,"username":"Bruixing"}
* 排序4:{"age":7,"username":"bzeyi"}
*/
for (int i = 0; i < list.size(); i++) {
System.out.println("排序4:" + JSON.toJSONString(list.get(i)));
} } }
String忽略大小写方法compareToIgnoreCase源码及Comparator自定义比较器的更多相关文章
- [Java源码解析] -- String类的compareTo(String otherString)方法的源码解析
String类下的compareTo(String otherString)方法的源码解析 一. 前言 近日研究了一下String类的一些方法, 通过查看源码, 对一些常用的方法也有了更透彻的认识, ...
- Scala 深入浅出实战经典 第41讲:List继承体系实现内幕和方法操作源码揭秘
Scala 深入浅出实战经典 第41讲:List继承体系实现内幕和方法操作源码揭秘 package com.parllay.scala.dataset /** * Created by richard ...
- HttpServlet中service方法的源码解读
前言 最近在看<Head First Servlet & JSP>这本书, 对servlet有了更加深入的理解.今天就来写一篇博客,谈一谈Servlet中一个重要的方法-- ...
- Pycharm中查看方法的源码
方法1.鼠标放在函数上,Ctrl+B,看源码 方法2.将光标移动至要查看的方法处,按住ctrl 键,点击鼠标左键,即可查看该方法的源码.
- 如何查看laravel门脸类包含方法的源码
以Route门脸类为例,我们定义路由时使用的就是Route门脸类,例如我们在web.php中定义的路由 use Illuminate\Support\Facades\Route; Route::get ...
- 《JAVA高并发编程详解》-Thread start方法的源码
Thread start方法的源码:
- asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证
原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetPara ...
- Spring源码-IOC部分-自定义IOC容器及Bean解析注册【4】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- rest-framework源码解析和自定义组件----版本
版本 url中通过GET传参自定义的版本 12345678910111213141516171819202122 from django.http import HttpResponsefrom dj ...
- String、StringBuffer、StringBuilder源码分析
利用反编译具体看看"+"的过程 1 public class Test 2 { 3 public static void main(String[] args) 4 { 5 int ...
随机推荐
- Java依赖冲突高效解决之道
简介:由于阿里妈妈联盟团队负责业务的特殊性,系统有庞大的对外依赖,依赖集团六七十个团队服务及N多工具组件,通过此文和大家分享一下我们积累的一些复杂依赖有效治理的经验,除了简单技术技巧的总结外,也会探 ...
- Java开启异步的两种方式
二.Java开启异步的两种方式 1.注解开启:@Async 1.1.配置异步的线程池 必须配置异步线程池,否则异步不会生效. @EnableAsync 注解:指定异步线程池.不指定默认使用:Simpl ...
- .NET开源、功能强大、跨平台的图表库 - LiveCharts2
前言 今天大姚给大家分享一个.NET开源(MIT License).功能强大.简单.灵活.跨平台的图表.地图和仪表库:LiveCharts2. 项目介绍 LiveCharts2是一个.NET开源. ...
- 02 Xpath Helper介绍
目录 参考文档 下载地址 安装 使用 参考文档 xpath helper https://www.cnblogs.com/ChevisZhang/p/12869582.html http://c.bi ...
- 【项目学习】Anchor:一种提供稳定币存款低波动收益率的去中心化的储蓄协议
简介 基于稳定币的获利产品. 贷方人放出稳定币以供借款.借方通过抵押资产(base asset)的方式,以低于协议定义的借贷比率借入稳定币.Anchor 协议使用抵押资产进行质押以获得奖励,然后将质押 ...
- 案例-java贪吃蛇(附源码)
创建屏幕 开始游戏的窗口,首先引入窗口,然后在窗口画布上进行添加各类动画. JFrame frame=new JFrame("My SnakeGame"); Jframe 是个类, ...
- 阿克曼函数(Ackermann function)部分推导
相关题目 已知\(Ackermann function\)为 \[Ack(m,n)=\begin{cases}n+1(m=0) \\ Ack(m-1,1)(m>0,n=0) \\ Ack(m-1 ...
- Docker 必知必会3----使用自己制作的镜像
前面的两篇文章分别讲了,docker的基础概念,设计思路以及docker的基本操作.感兴趣的同学可以查阅: https://www.cnblogs.com/jilodream/p/18177695ht ...
- 记录一次对MQTT协议的渗透测试经历
前言 由于工作需要,特意翻查了MQTT的相关漏洞,并一一学习复现,在此做以学习记录,没有恶意,如有抄袭,请私信作者删除. 技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站.服务器等 ...
- Java基础 韩顺平老师的 常用类 的部分笔记
459,八大Wrapper类 包装类的分类 1) 针对八种基本数据类型相应的引用类型-包装类 2) 有了类的特点, 就可以调用类中的方法. 460,装箱和拆箱 package com.hspedu.W ...