Java字符串排序中文+数字

2023-05-16

编写日期: 2013年9月15日

另一中解法:点击查看

解决思路: 在Java中,排序需要复写的是 equals 方法 和 Comparable<T> 接口 的public int compareTo(T o); 方法

步骤:

1. 使用正则表达式来判断数字,多个连续的数字作为一组,

2.  一次检索出数字组合,

3. 检出下一组数字,如果有,则进入步骤4,否则进入步骤6.

4. 如果两组数字出现的位置相等,并且前面部分的字符串相等,则进入第5步。否则break,跳到第6步.

5. 如果前面部分的字符串完全一致。则比较两个数字的大小,如果大小一致,则进入下一组,即步骤3.如果大小不一致,则可以比对出来大小,比较结束

6. 调用String的compareTo方法,病返回(流程结束)。

完整的代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

//包装器类
public class OrderWrapper implements Comparable<OrderWrapper>{
	String name = null;
	public OrderWrapper(String name){
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {
		return String.valueOf(name);
	}
	@Override
	public boolean equals(Object obj) {
		if(obj == this){
			return true;
		} 
		
		if(obj instanceof OrderWrapper){
			OrderWrapper other = (OrderWrapper)obj;
	
			if(null == this.name){
				return false;
			} else {
				return this.name.equals(other.name);
			}
		}
		return false;
	}

	// 比较方法,相当于减法。 (return this - wrapper)
	public int compareTo(OrderWrapper wrapper) {
		if(null == wrapper){
			return 1;
		}
		// 直接相等
		if(this == wrapper || this.equals(wrapper)){
			return 0;
		}
		String name1 = this.name;
		String name2 = wrapper.name;
		// 特殊情形,name有一个为空的情况.
		if(null == name1){
			// 都为空,认为相对
			if(null == name2){
				return 0;
			} else {
				return -1;
			}
		} else if(null == name2){
			return 1;
		}
		// 中间 1-多个数字
		Pattern pattern = Pattern.compile("\\D*(\\d+)\\D*");
		Matcher matcher1 = pattern.matcher(name1);
		Matcher matcher2 = pattern.matcher(name2);
		//System.out.println(pattern.pattern());
		//
		int index1_step = 0;
		int index2_step = 0;
		while(matcher1.find()){
			String s1 = matcher1.group(1);
			String s2 = null;
			if(matcher2.find()){
				s2 = matcher2.group(1);
			}
			int index1 = name1.indexOf(s1, index1_step);
			int index2 = name2.indexOf(s2, index2_step);
			//
			index1_step = index1;
			index2_step = index2;
			// 索引相等的情况下
			if(index1 == index2){
				System.out.println("name1="+name1.length()+"\nname2="+name2.length());
				System.out.println("index1="+index1+",index2="+index2);
				String pre1 = name1.substring(0, index1);
				String pre2 = name2.substring(0, index2);
				if(pre1.equals(pre2)){
					// 
					long num1 = Long.parseLong(s1);
					long num2 = Long.parseLong(s2);
					//
					if(num1 == num2){
						// 比较下一组
						continue;
					} else {
						return (int)(num1 - num2);
					}
				} else {
					break;
				}
			} else {
				break;
			}
		}
		
		// 最后的情形.
		return this.name.compareTo(wrapper.name);
	}
	

	public static void testNew(){
		List<OrderWrapper> chinesesOrderList = new ArrayList<OrderWrapper>();  
        chinesesOrderList.add(new OrderWrapper("我们80后相亲奇遇记-1.mp3"));  
        chinesesOrderList.add(new OrderWrapper("他80后相亲奇遇记-10.mp3"));  
        chinesesOrderList.add(new OrderWrapper("我80后相亲奇遇记-11.mp3"));  
        chinesesOrderList.add(new OrderWrapper("啊80后相亲奇遇记-12.mp3"));  
        chinesesOrderList.add(new OrderWrapper("我80后相亲奇遇记-13.mp3"));  
        chinesesOrderList.add(new OrderWrapper("我80后相亲奇遇记-25.mp3"));  
        chinesesOrderList.add(new OrderWrapper("我80后相亲奇遇记-26.mp3"));  
        chinesesOrderList.add(new OrderWrapper("我80后相亲奇遇记-2.mp3"));  
        chinesesOrderList.add(new OrderWrapper("我80后相亲奇遇记-3.mp3"));  
        chinesesOrderList.add(new OrderWrapper("我80后相亲奇遇记-4.mp3"));  
        chinesesOrderList.add(new OrderWrapper("a80后相亲奇遇记-4.mp3"));  
   
        //Collator collatorChinese = Collator.getInstance(java.util.Locale.CHINA);  
        //collatorChinese = Collator.getInstance(java.util.Locale.CHINESE);  
       // Collections.sort(chinesesOrderList, collatorChinese);  
        Collections.sort(chinesesOrderList);  

        System.out.println("中文+数字排序: = ");  
        for (int i = 0; i < chinesesOrderList.size(); i++) {  
        	OrderWrapper chinese = chinesesOrderList.get(i);  
            System.out.println("" + chinese);  
        }  

	}
	
	public static void main(String[] args) {
		testNew();
	}
}


转载于:https://www.cnblogs.com/lanzhi/p/6467095.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java字符串排序中文+数字 的相关文章

随机推荐

  • maven仓库阿里云镜像配置

    我们每次新建一个maven项目的时候 xff0c 加上pom xml配置时 xff0c 如果你没有配置本地仓库 xff0c maven会去中央仓库去加载jar包 xff0c 那样速度真的是异常的慢啊 xff0c 并且每次update mav
  • Office 2010启动时出现无法验证此应用程序的许可证的解决

    Office 2010启动之后弹出一个窗口提示 xff1a Microsoft Office无法验证此应用程序的许可证 修复尝试失败或者已被用户取消 应用程序将立即关闭 遇到这样的情况 xff0c 原因是Office的系统服务被禁用的原因
  • 前端路由跳转基本原理

    目前前端三杰 Angular React Vue 都推介单页面应用 SPA 开发模式 xff0c 在路由切换时替换 DOM Tree 中最小修改的部分 DOM xff0c 来减少原先因为多页应用的页面跳转带来的巨量性能损耗 它们都有自己的典
  • proxyTable的配置

    在dev环境下面 xff1a proxyTable 39 api 39 target 39 http api douban com v2 39 主域名 xff0c 以前我都写192 168 2 57 80 xff0c 这里跨域了 chang
  • secureCRT 8 license

    secureCRT 8 license Name Company Serial Number License Key Issue Date Admin FENG 03 47 186992 ACF3C7 NZD1JC JHMRJ6 KWC53
  • 如何使用CSS3来获取屏幕宽度并且用来计算DIV高度

    稍微出示一下我之前的代码 var global width 61 window width var info height 61 global width 750 230 之前需要用js实现的计算相对高度 xff0c 现在要交给CSS来实现
  • haproxy 配置详解

    说明 xff1a 1 haproxy的配置段有 34 global 34 xff0c 34 defaults 34 34 listen 34 34 frontend 34 和 34 backend 34 等 global 配置中的参数为进程
  • 什么是灰度图

    为什么80 的码农都做不了架构师 xff1f gt gt gt 图像灰度值的概念是什么 xff1f 灰度也可以认为是亮度 xff0c 简单说就是色彩的深浅程度 实际上在我们的日常生活中 xff0c 通过三原色色彩深浅的组合 xff0c 可以
  • matlab figure 窗口最大化

    http blog 163 com yinhexiwen 64 126 blog static 6404826620122942057214 figure 窗口最大化 xff0c 坐标轴也随着窗口变大而相应变大 scrsz 61 get 0
  • 让Tomcat7识别War包的Class-Path(MANIFEST.MF)属性动态加载类路径

    原文 https my oschina net noahxiao blog 173499 目录 一 背景 二 分析 三 开发 四 总结 一 背景 几个Web项目需要打包到一个发布包中 xff0c 问题是War包都各自包含了自己的WEB IN
  • 【黑马程序员】————结构体

    Java培训 Android培训 iOS培训 Net培训 期待与您交流 xff01 一 什么是结构体 数组 xff1a 只能由多个相同类型的数据构成 结构体 xff1a 可以由多个不同类型的数据构成 二 结构体的定义 1 定义形式 结构体内
  • 《oracle大型数据库系统在AIX/unix上的实战详解》讨论28:两台机器间Oracle迁移的方法和过程...

    oracle大型数据库系统在AIX unix上的实战详解 讨论28 xff1a 两台机器间Oracle迁移的方法和过程 文平 大家新年好 xff01 新年期间没有更新日志 xff0c 也没有查收大家发来的邮件 今天回到工作岗位 xff0c
  • 《Programming in Lua 3》读书笔记(十六)

    日期 xff1a 2014 7 23 Part The Standard Libraries 20 The Table Library table库包含一些辅助函数用以类似与数组一样操作table 提供了从list内插入和删除元素的操作 x
  • 重磅系列文章|UI2Code智能生成Flutter代码--整体设计篇 ...

    闲鱼技术 上叶 背景 随着移动互联网时代的到来 xff0c 人类的科学技术突飞猛进 然而软件工程师们依旧需要花费大量精力在重复的还原UI视觉稿的工作 UI视觉研发拥有明显的特征 xff1a 组件 xff0c 位置和布局 xff0c 符合机器
  • linux debian系统卸载jdk,Debian/Ubuntu系统 JDK卸载、安装、环境配置

    环境 xff1a Linux内核版本4 17 Oracle jdk 11 0 2 JDK 8同样也是设置 Debian9系统 注意 xff1a 1 Open JDK和Oracle JDK的安装过程只是下载的连链接不一样 2 有的Linux系
  • MySQL 8.0 Windows zip 安装过程

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 准备 xff1a MySQL8 0 Windows zip包下载地址 xff1a https cdn mysql com Downloads MySQL 8 0 mysql
  • nohup后台执行脚本并输入日志到指定目录 &

    后台执行命令 xff0c 并输出目录到指定目录 root 64 localhost smgpSend Log nohup tar zcvf sendThread bak tar sendThread bak gt gt 1 txt amp
  • 在 Laravel 5 中集成七牛云存储实现云存储功能

    本扩展包基于https github com qiniu php sdk 开发 xff0c 是七牛云储存 Laravel 5 Storage版 xff0c 通过本扩展包可以在Laravel 5中集成七牛云存储功能 1 安装配置 使用之前 x
  • BSS段、数据段、代码段、堆与栈

    BSS段 xff1a BSS段 xff08 bss segment xff09 通常是指用来存放程序中未初始化的全局变量的一块内存区域 BSS是英文Block Started by Symbol的简称 BSS段属于静态内存分配 数据段 xf
  • Java字符串排序中文+数字

    编写日期 xff1a 2013年9月15日 另一中解法 xff1a 点击查看 解决思路 xff1a 在Java中 xff0c 排序需要复写的是 equals 方法 和 Comparable lt T gt 接口 的public int co