package cn.cnnho.backstage.utils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

import cn.cnnho.backstage.test.User;
import cn.cnnho.backstage.vo.file.OriginalFileModel;

public class StringComparatorUtils implements Comparator<User>{
private String str1, str2;
private int pos1, pos2, len1, len2;

public int compare(Users1, Users2)
{
str1 = s1.getName();
str2 = s2.getName();
len1 = str1.length();
len2 = str2.length();
pos1 = pos2 = 0;

int result = 0;
while (result == 0 && pos1 < len1 && pos2 < len2)
{
char ch1 = str1.charAt(pos1);
char ch2 = str2.charAt(pos2);

if (Character.isDigit(ch1))
{
result = Character.isDigit(ch2) ? compareNumbers() : -1;
}
else if (Character.isLetter(ch1))
{
result = Character.isLetter(ch2) ? compareOther(true) : 1;
}
else
{
result = Character.isDigit(ch2) ? 1
: Character.isLetter(ch2) ? -1
: compareOther(false);
}

pos1++;
pos2++;
}

return result == 0 ? len1 - len2 : result;
}

private int compareNumbers()
{
int end1 = pos1 + 1;
while (end1 < len1 && Character.isDigit(str1.charAt(end1)))
{
end1++;
}
int fullLen1 = end1 - pos1;
while (pos1 < end1 && str1.charAt(pos1) == '0')
{
pos1++;
}

int end2 = pos2 + 1;
while (end2 < len2 && Character.isDigit(str2.charAt(end2)))
{
end2++;
}
int fullLen2 = end2 - pos2;
while (pos2 < end2 && str2.charAt(pos2) == '0')
{
pos2++;
}

int delta = (end1 - pos1) - (end2 - pos2);
if (delta != 0)
{
return delta;
}

while (pos1 < end1 && pos2 < end2)
{
delta = str1.charAt(pos1++) - str2.charAt(pos2++);
if (delta != 0)
{
return delta;
}
}

pos1--;
pos2--;

return fullLen2 - fullLen1;
}

private int compareOther(boolean isLetters)
{
char ch1 = str1.charAt(pos1);
char ch2 = str2.charAt(pos2);

if (ch1 == ch2)
{
return 0;
}

if (isLetters)
{
ch1 = Character.toUpperCase(ch1);
ch2 = Character.toUpperCase(ch2);
if (ch1 != ch2)
{
ch1 = Character.toLowerCase(ch1);
ch2 = Character.toLowerCase(ch2);
}
}
return ch1 - ch2;
}
public static void main(String[] args) {
//list集合
// List<User> list = new ArrayList<User>();
// User user = new User();
// user.setName("1.jpg");
// user.setAge("12");
// User user1 = new User();
// user1.setName("10.jpg");
// user1.setAge("13");
// User user2 = new User();
// user2.setName("2.jpg");
// user2.setAge("14");
// User user3 = new User();
// user3.setName("2a2.jpg");
// user3.setAge("15");
// list.add(user);
// list.add(user1);
// list.add(user2);
// list.add(user3);
// List<User> result = list.stream().sorted(new StringComparatorUtils()).collect(Collectors.toList());
//
//
// Collections.sort(list,new StringComparatorUtils());
// for(int i = 0;i < result.size();i++){
// System.out.println(result.get(i).getName().toString());
// }
//数组
// String arr[] = {"1.jpg", "12.jpg", "10.jpg", "2.jpg", "2abc.jpg","a2bc.jpg","a1bc.jpg"};
//
// Arrays.sort(arr, new StringComparatorUtils());
// for(int i=0;i<arr.length;i++){
// System.out.println(arr[i]);
// }
}

}

java字符串排序(数字,字母,汉字等组合排序)的更多相关文章

  1. js正则匹配数字字母汉字

    1,匹配所有字母数字汉字:^[A-Za-z0-9\u4e00-\u9fa5]+$2,清空某项:$('#id').empty()3,某项功能关闭,不再执行:$('#id').off()4,查看数据类型: ...

  2. java:字符串与数字的转换

    各种数字类型转换成字符串型 int i =8; String s =Integer.toString(i);// String g =String.valueOf(i); // 其中 value 为任 ...

  3. JS截字符串处理数字,汉字,英文问题

    <script> function suolve( str,sub_length ){ var temp1 = str.replace(/[^\x00-\xff]/g,"**&q ...

  4. Java字符串转数字和数字转字符串

    int转String有3种方式 (1)num + "" (2)String.valueOf(num) (3)Integer.toString(num) String转int有2种方 ...

  5. [原]Java面试题-将字符串中数字提取出来排序后输出

    [Title][原]Java面试题-将字符串中数字提取出来排序后输出 [Date]2013-09-15 [Abstract]很简单的面试题,要求现场在纸上写出来. [Keywords]面试.Java. ...

  6. php如何判断字符串是否是字母和数字的组合

    转载自百度 /其实判断是否是字母和数字或字母数字的组合还可以用PHP ctype_alnum函数 if(!ctype_alnum($vipurl)){ echo '只能是字母或数字的组合';exit; ...

  7. PHP中生成随机字符串,数字+大小写字母随机组合

    简单的生成随机字符串: /* * 生成随机字符串 * * $length 字符串长度 */ function random_str($length) { // 密码字符集,可任意添加你需要的字符 $c ...

  8. Java正则表达式过滤出字母、数字和中文

    原文:http://blog.csdn.net/k21325/article/details/54090066 1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [^(A ...

  9. java字符串数组进行大小排序

    若是将两个字符串直接比较大小,会包:The operator > is undefined for the argument type(s) java.lang.String, java.lan ...

随机推荐

  1. UVA - 1572 Self-Assembly(图论模型+拓扑排序)

    题意:判断利用给出的正方形是否能拼接出无限延伸的结构. 分析:正方形上的字母看做点,正方形看做有向边. 例如: 若上下两个正方形能拼接,需要B+~C+是个有向边. 对输入的处理是:把A+,A-分别映射 ...

  2. C++ Winsock

    由于兼容的问题更新下winsock,有较好的移植性:客户端是非阻塞的,服务器是阻塞的! Win32控制台: 数据收发: 服务器向客户端发送一个txt文本内容和一个结构体数据: 服务器代码: #incl ...

  3. 启用root关闭客人会话

    1.位root用户设置密码: sudo passwd root 2.修改配置文件/usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf(先备份) 添加如下在文 ...

  4. 十八、JavaScript之布尔类型

    一.代码如下 二.运行效果 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" conten ...

  5. 029-PHP取随机数

    <?php //打印从1到100中间的10个随机的数 ; $index < ; $index++) { print(rand(,) . "<BR>\n"); ...

  6. 094-PHP遍历索引数组和关联数组

    <?php $arr=array(63,'abc',45,'hello',3,7,9,'DEF'); //定义一个索引数组 echo '遍历一个索引数组:<br />'; forea ...

  7. 4. Linux 集群安装

    1. 配置yum yum clean all yum makecache yum install wget 2.安装JDK (1) 将jdk-7u60-linux-i586.rpm通过WinSCP上传 ...

  8. 可并堆模板题-mergeable heap

    Description 有n个点,第i个点标号为i,有两种操作:0 x y 表示把x所在堆和y所在堆合并.1 x 表示询问x所在堆的最小权. Input 第一行两个整数n,m,表示有n个点m个操作. ...

  9. sublime text 常用插件安装

    一.安装方法 ctrl+ship+p —— 在弹出的地方输入 pci (package control: install pagckage)—— 再输入 要安装的包名 二.一步过慢或失败解决: 原因: ...

  10. 吴裕雄--天生自然C++语言学习笔记:C++ 数据结构

    C/C++ 数组允许定义可存储相同类型数据项的变量,但是结构是 C++ 中另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项. 结构用于表示一条记录,假设想要跟踪图书馆中书本的动态,可能需要 ...