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 ...
随机推荐
- 供应链商品域DDD实践
简介: DDD是一套方法论,实践能否成功,不仅仅是个技术问题,更是执行贯彻实施的问题.本文将就DDD的基本概念和DDD的实施进行分享. 作者 | 侧帽来源 | 阿里技术公众号 前言 供应链商品域DDD ...
- 【ESSD技术解读-04】ESSD Auto PL规格,引领IO性能弹性新方向
简介: 阿里云 ESSD 为云服务器 ECS 提供低时延.持久性和高可靠的块存储服务,成为云厂商全闪块存储的业界标杆.存储团队推出了 ESSD Auto PL 新的云盘规格,把性能与容量解耦,提供 ...
- 一文搞懂物联网Modbus通讯协议
简介: 一般来说,常见的物联网通讯协议众多,如蓝牙.Zigbee.WiFi.ModBus.PROFINET.EtherCAT.蜂窝等.而在众多的物联网通讯协议中,Modbus是当前非常流行的一种通讯协 ...
- uniapp中使用极光推送
1.注册极光账号 2.注册几个主流手机厂商的开发者账号(注册手机厂商,可以保证app进程不在的时候走厂商通道推送消息) 3.配置uniapp极光插件 https://ext.dcloud.net.cn ...
- .NET使用P/Invoke来实现注册表的增、删、改、查功能
注册表可以用来进行存储一些程序的信息,例如用户的权限.或者某些值等,可以根据个人需要进行存储和删减. 当前注册表主目录: 引用包 Wesky.Net.OpenTools 1.0.5或者以上版本 操作演 ...
- 深度学习项目-MobileNetV2水果识别模型
FruitRecognition DeepLearning深度学习小项目,利用CNN和MobileNetV2搭建的水果识别模型. github地址 fruit为本次大作业使用的数据集. geneFru ...
- MinIo对象存储文件上传,下载,预览,批量上传,创建桶等
MinIo 操作工具类 MinIo 旧中文文档 MinIo 英文文档 MinIo 官网地址 https://min.io/ package com.ming.utils; import io.mini ...
- CeiT:商汤提出结合CNN优势的高效ViT模型 | 2021 arxiv
论文提出CeiT混合网络,结合了CNN在提取低维特征方面的局部性优势以及Transformer在建立长距离依赖关系方面的优势.CeiT在ImageNet和各种下游任务中达到了SOTA,收敛速度更快,而 ...
- 腾讯面试:如何提升Kafka吞吐量?
Kafka 是一个分布式流处理平台和消息系统,用于构建实时数据管道和流应用.它最初由 LinkedIn 开发,后来成为 Apache 软件基金会的顶级项目. Kafka 特点是高吞吐量.分布式架构.支 ...
- npm 错误,ERESOLVE unable to resolve dependency tree 解决方案
参考:https://blog.csdn.net/qq_42055933/article/details/132098617 背景: 当在使用npm install时遇到 "ERESOLVE ...