自定义Comparator比较String字符串

自定义字符串排序与存储
本文介绍了如何使用自定义比较器实现字符串数组的排序,并通过示例代码展示了按特定规则排序字符串的方法。
package sn.len.demo;

import java.util.Arrays;
import java.util.Comparator;
//一般用Arrays.sort都按一个一个的字符去比较的,而不是按照自己所想根据Ascii去比较的,所以。。。。
public class ArrayStore
{
	public static void main(String[] args)
	{
		String str[] = new String[5];
		str[0] = "OPS/chapter5.html";
		str[1] = "OPS/chapter4.html";
		str[2] = "OPS/chapter69.html";
		str[3] = "OPS/chapter7.html";
		str[4] = "OPS/chapter27.html";

		Arrays.sort(str, htmlComp);
		for (int i = 0; i < str.length; i++)
		{
			System.out.println(str[i]);
		}

	}
	private static Comparator<String> htmlComp = new Comparator<String>()
	{
		@Override
		public int compare(String o1, String o2)
		{
			if (o1.startsWith("OPS/chapter") && o2.startsWith("OPS/chapter"))
			{
				System.out.println("o1---->"+o1);
				System.out.println("o2---->"+o2);
				String num1 = o1.substring("OPS/chapter".length(), o1.lastIndexOf(".html"));
				String num2 = o2.substring("OPS/chapter".length(), o2.lastIndexOf(".html"));
				try
				{
					Integer int1 = Integer.valueOf(num1);
					Integer int2 = Integer.valueOf(num2);
					return int1.compareTo(int2);
				} catch (Exception e)
				{
					return o1.compareTo(o2); //按字典顺序去比较两个字符串
				}
			}
			return o1.compareTo(o2);//按字典顺序去比较两个字符串
		}
	};
}

<think>我们刚刚讨论了String类的常用方法,现在用户询问String类中是否有比较字符串大小的方法。在Java中,String类确实提供了比较字符串大小的方法。主要有两种方式:1.使用`compareTo(StringanotherString)`方法:按字典顺序比较两个字符串。2.使用`compareToIgnoreCase(Stringstr)`方法:按字典顺序比较两个字符串,忽略大小写。下面将详细解释这两种方法,并给出代码示例。</think>### Java String类的字符串大小比较方法详解 在Java中,String类提供了两种主要的字符串大小比较方法,它们基于字典顺序(lexicographical order)进行比较: #### 1. `compareTo(String anotherString)` 方法 ```java public int compareTo(String anotherString) ``` **功能**:按字典顺序比较两个字符串(区分大小写) **返回值**: - 负数:当前字符串小于参数字符串 - 零:两个字符串相等 - 正数:当前字符串大于参数字符串 **比较规则**: 1. 逐个字符比较Unicode值 2. 遇到第一个不同字符时返回差值 3. 当较短字符串是较长字符串的前缀时,返回长度差 ```java String s1 = "apple"; String s2 = "banana"; String s3 = "Apple"; String s4 = "app"; System.out.println(s1.compareTo(s2)); // -1('a'<'b') System.out.println(s1.compareTo(s3)); // 32('a'=97 vs 'A'=65 → 97-65=32) System.out.println(s1.compareTo(s4)); // 2("apple"比"app"长2个字符) System.out.println(s1.compareTo(s1)); // 0(相同字符串) ``` #### 2. `compareToIgnoreCase(String str)` 方法 ```java public int compareToIgnoreCase(String str) ``` **功能**:按字典顺序比较字符串(不区分大小写) **返回值**:与`compareTo()`相同,但忽略大小写差异 ```java System.out.println(s1.compareToIgnoreCase(s3)); // 0(忽略大小写视为相等) System.out.println("Zebra".compareToIgnoreCase("apple")); // 25('Z'→'z'=122, 'a'=97 → 122-97=25) ``` ### 完整比较示例 ```java public class StringComparisonDemo { public static void main(String[] args) { String[] fruits = {"Apple", "banana", "Cherry", "apple", "Banana"}; // 区分大小写的比较 System.out.println("区分大小写比较:"); for (int i = 0; i < fruits.length; i++) { for (int j = i + 1; j < fruits.length; j++) { int result = fruits[i].compareTo(fruits[j]); System.out.printf("\"%s\" vs \"%s\": %s (%d)%n", fruits[i], fruits[j], result == 0 ? "相等" : result < 0 ? "小于" : "大于", result); } } // 忽略大小写的比较 System.out.println("\n忽略大小写比较:"); for (int i = 0; i < fruits.length; i++) { for (int j = i + 1; j < fruits.length; j++) { int result = fruits[i].compareToIgnoreCase(fruits[j]); System.out.printf("\"%s\" vs \"%s\": %s (%d)%n", fruits[i], fruits[j], result == 0 ? "相等" : result < 0 ? "小于" : "大于", result); } } } } ``` ### 输出结果示例: ``` 区分大小写比较: "Apple" vs "banana": 小于 (-31) "Apple" vs "Cherry": 小于 (-34) "Apple" vs "apple": 小于 (-32) "Apple" vs "Banana": 小于 (-31) "banana" vs "Cherry": 大于 (31) ... 忽略大小写比较: "Apple" vs "banana": 小于 (-65) "Apple" vs "Cherry": 小于 (-34) "Apple" vs "apple": 相等 (0) "Apple" vs "Banana": 小于 (-65) ... ``` ### 关键注意事项: 1. **字典顺序规则**: - 大写字母 < 小写字母('A'=65 < 'a'=97) - 数字 < 字母('0'=48 < 'A'=65) - 常见符号根据ASCII/Unicode值排序 2. **性能考虑**: - 时间复杂度:O(n),n为较短字符串的长度 - 对于大量比较操作,考虑使用`Collator`类进行本地化排序 3. **替代方案**: ```java // 使用Comparator进行自定义比较 Comparator<String> caseInsensitiveOrder = String.CASE_INSENSITIVE_ORDER; int result = caseInsensitiveOrder.compare("Apple", "apple"); // 0 // 使用equals进行相等性检查 boolean isEqual = "Hello".equals("hello"); // false boolean isEqualIgnoreCase = "Hello".equalsIgnoreCase("hello"); // true ``` 4. **特殊字符处理**: - Unicode代理对(surrogate pairs)会被正确处理 - 不同语言的排序规则可能不同(如德语ä排序)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值