`
JavaFans
  • 浏览: 88920 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java String比较的基础问题

阅读更多
Java6的标准库里面的string比较的方法,感觉其中有部分是多余的。也就是说,两个Byte在比较了Character.toUpperCase(c1)之后,如果不相等,应该这两个char就不一样了,没有必要再比较Character.toLowerCase(c1)了。

public int compare(String s1, String s2) {
            int n1=s1.length(), n2=s2.length();
            for (int i1=0, i2=0; i1<n1 && i2<n2; i1++, i2++) {
                char c1 = s1.charAt(i1);
                char c2 = s2.charAt(i2);
                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) {
                            return c1 - c2;
                        }
                    }
                }
            }
            return n1 - n2;
        }


分享到:
评论
7 楼 JavaFans 2010-03-17  
wannago 写道
ivywjhua 写道

char 不仅有字母,还有字符, 如[^
从这个实现来看是用小写字母来做最后比较的

有道理。我gogle了一下,发现了这些:
1. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6464154
上面说在因为在大写和小写字母间有些字符,如果做ignore case比较,你得做个选择,它们应该大于字母还是小于字母--即基于大写字母比较还是小写字母。
    在windows下,它们都是基于大写字母的,linux是基于小写的。简单测试:建立“aa”,“_a", "[a"文件,然后在windows下dir或者linux下ls比较。
    java和linux下一样都基于小写的。

2. 如果google看看gnu的java实现,可以看到这个函数:
  public int compareToIgnoreCase(String str)
  {
    return this.toUpperCase().toLowerCase().compareTo(
     str.toUpperCase().toLowerCase());
  }

看起来ignore case比较都是先变大写比较,再变小写比较。原因有人给出解释
http://www.codeguru.com/forum/archive/index.php/t-207356.html
上面说:有的字符比如希腊字符sigma有两种不同的小写方式,但是大写方式一样,还有的是大写方式不一样,但小写一样!运行这个测试程序就明白了:
public class T {

    static public void main(String[] args) {
        int CHAR_TEST = 1000;
        for (int i = 0; i < CHAR_TEST; i++) {
            char ch = (char) i;
            for (int j = 0; j < CHAR_TEST; j++) {
                if (i != j) {
                    char ch2 = (char) j;
                    if (ch2 != ch) {
                        boolean b1 = Character.toUpperCase(ch) == Character.toUpperCase(ch2);
                        boolean b2 = Character.toLowerCase(ch) == Character.toLowerCase(ch2);
                        if (b1 && !b2) {
                            System.out.print("UPPER SAME FOR: " + i + " and " + j + ". ");
                            System.out.println("Ch1=" + ch + ". Ch2=" + ch2 + ".");
                        } else if (b2 && !b1) {
                            System.out.print("LOWER SAME FOR: " + i + " and " + j + ". ");
                            System.out.println("Ch1=" + ch + ". Ch2=" + ch2 + ".");
                        }
                    }
                }
            }
        }
    }
}



很有道理,这应该是很全面的回答了。
学到了不少,谢谢
6 楼 wannago 2010-02-21  
ivywjhua 写道

char 不仅有字母,还有字符, 如[^
从这个实现来看是用小写字母来做最后比较的

有道理。我gogle了一下,发现了这些:
1. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6464154
上面说在因为在大写和小写字母间有些字符,如果做ignore case比较,你得做个选择,它们应该大于字母还是小于字母--即基于大写字母比较还是小写字母。
    在windows下,它们都是基于大写字母的,linux是基于小写的。简单测试:建立“aa”,“_a", "[a"文件,然后在windows下dir或者linux下ls比较。
    java和linux下一样都基于小写的。

2. 如果google看看gnu的java实现,可以看到这个函数:
  public int compareToIgnoreCase(String str)
  {
    return this.toUpperCase().toLowerCase().compareTo(
     str.toUpperCase().toLowerCase());
  }

看起来ignore case比较都是先变大写比较,再变小写比较。原因有人给出解释
http://www.codeguru.com/forum/archive/index.php/t-207356.html
上面说:有的字符比如希腊字符sigma有两种不同的小写方式,但是大写方式一样,还有的是大写方式不一样,但小写一样!运行这个测试程序就明白了:
public class T {

    static public void main(String[] args) {
        int CHAR_TEST = 1000;
        for (int i = 0; i < CHAR_TEST; i++) {
            char ch = (char) i;
            for (int j = 0; j < CHAR_TEST; j++) {
                if (i != j) {
                    char ch2 = (char) j;
                    if (ch2 != ch) {
                        boolean b1 = Character.toUpperCase(ch) == Character.toUpperCase(ch2);
                        boolean b2 = Character.toLowerCase(ch) == Character.toLowerCase(ch2);
                        if (b1 && !b2) {
                            System.out.print("UPPER SAME FOR: " + i + " and " + j + ". ");
                            System.out.println("Ch1=" + ch + ". Ch2=" + ch2 + ".");
                        } else if (b2 && !b1) {
                            System.out.print("LOWER SAME FOR: " + i + " and " + j + ". ");
                            System.out.println("Ch1=" + ch + ". Ch2=" + ch2 + ".");
                        }
                    }
                }
            }
        }
    }
}

5 楼 ivywjhua 2010-02-20  
JavaFans 写道
Java6的标准库里面的string比较的方法,感觉其中有部分是多余的。也就是说,两个Byte在比较了Character.toUpperCase(c1)之后,如果不相等,应该这两个char就不一样了,没有必要再比较Character.toLowerCase(c1)了。

public int compare(String s1, String s2) {
            int n1=s1.length(), n2=s2.length();
            for (int i1=0, i2=0; i1<n1 && i2<n2; i1++, i2++) {
                char c1 = s1.charAt(i1);
                char c2 = s2.charAt(i2);
                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) {
                            return c1 - c2;
                        }
                    }
                }
            }
            return n1 - n2;
        }




char 不仅有字母,还有字符, 如[^
从这个实现来看是用小写字母来做最后比较的
4 楼 sing4j 2010-02-20  
asscii
3 楼 JavaFans 2010-02-20  
是这个函数

wannago 写道
String有compare这个方法?莫非你指这个?
    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(), n2=s2.length();
            for (int i1=0, i2=0; i1<n1 && i2<n2; i1++, i2++) {
                char c1 = s1.charAt(i1);
                char c2 = s2.charAt(i2);
                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) {
                            return c1 - c2;
                        }
                    }
                }
            }
            return n1 - n2;
        }
    }

compare还是得比较哪一个大哪一个小吧

在我的理解,比较大小直接使用c1-c2就行了。
例如一种可能的实现:
    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(), n2=s2.length();
            for (int i1=0, i2=0; i1<n1 && i2<n2; i1++, i2++) {
                char c1 = s1.charAt(i1);
                char c2 = s2.charAt(i2);
                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) {
                            return c1 - c2;
                        //}
                    }
                }
            }
            return n1 - n2;
        }
    }


2 楼 langhua9527 2010-02-20  
compare还是得比较哪一个大哪一个小吧
=====================================
9494,也把我吓一跳。。。。
1 楼 wannago 2010-02-20  
String有compare这个方法?莫非你指这个?
    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(), n2=s2.length();
            for (int i1=0, i2=0; i1<n1 && i2<n2; i1++, i2++) {
                char c1 = s1.charAt(i1);
                char c2 = s2.charAt(i2);
                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) {
                            return c1 - c2;
                        }
                    }
                }
            }
            return n1 - n2;
        }
    }

compare还是得比较哪一个大哪一个小吧

相关推荐

    java基础String类选择题练习题

    根据提供的信息,我们可以总结出这份Java基础String类选择题练习题主要聚焦于String及StringBuffer类的使用。尽管具体的题目内容未给出,但从所展示的信息中可以推断出该练习题集涵盖了以下几方面的知识点: ### 一...

    java String 使用详解

    Java String 使用详解是 Java 编程语言中最基础也是最重要的一部分,对于 Java 程序员来说,了解 String 类的使用方法是必不可少的。本文将详细介绍 Java String 的使用方法,包括 String 对象的初始化、字符串的...

    java String 数据结构

    总之,`java String`数据结构是Java编程的基础,理解和掌握其特性和常用方法对于任何Java开发者都至关重要。通过学习这些知识点,初学者能够编写更高效、更易于维护的代码。在实际开发中,合理利用`String`类提供的...

    java中String类型和int类型比较及相互转换

    在Java编程语言中,数据类型的比较与转换是基础但又至关重要的操作,尤其在处理文本与数字信息时。本文将深入探讨Java中String类型和int类型之间的比较方法以及相互转换的技术,这对于理解和优化代码逻辑、提升程序...

    JAVA String.format方法使用介绍

    在JDK1.5中,String类增加了一个非常有用的静态函数format(String format, Objece... argues),可以将各类数据格式化为字符串并输出。其中format参数指定了输出的格式,是最复杂也是最难掌握的一点,而argues则是一...

    Java String 字符串创建理解 equels和\"==\" 差异

    在Java编程语言中,字符串(String)是一个非常基础且重要的数据类型。它被广泛用于存储文本信息,而关于字符串创建的理解,以及"equals()"方法和"=="运算符的区别,是每个Java开发者都应深入掌握的知识点。 首先,让...

    java String Vector简单初学者代码

    Java中的String、Vector和Scanner是三个非常基础且重要的概念,对于初学者来说,理解它们的用法和原理是学习Java编程的关键步骤。 首先,我们来深入理解`String`类。在Java中,`String`是一个不可变的字符序列,这...

    String1.java

    ### Java字符串操作详解:String1.java程序分析 在Java编程语言中,字符串处理是一项非常重要的技能,无论是进行数据处理还是用户交互,字符串都是一个不可或缺的数据类型。本篇将基于提供的`String1.java`代码示例...

    Java基础复习(内附String中equals与==区别的分析)

    在Java编程语言中,基础知识是每个开发者都需要扎实掌握的关键部分。本篇复习将重点讨论String类中的`equals()`方法和`==`运算符的区别,这对于理解对象比较和字符串操作至关重要。 首先,`==`运算符在Java中用于...

    Java程序设计基础:String类的常用方法(一.pptx

    String message = “Welcome to Java”; System.out.print(message.length()); //输出字符串长度15 返回字符串中字符的个数,即长度。中文、英文都算作一个字符。 其语法形式如下:字符串名.length(); 例1:在某系统...

    java中将string类型转换成timestamp类型

    "Java中将String类型转换成Timestamp类型" 在Java编程语言中,String类型和Timestamp类型是两种不同的数据类型,前者用于存储字符串数据,而后者用于存储时间戳数据。然而,在实际开发中,我们经常需要将String类型...

    java 原始数组类型的String形式

    在Java编程语言中,原始数组类型是数据存储的基础结构,如int[], double[], char[]等。这些数组可以存储相同类型的多个值,并且在处理大量数据时非常有用。当我们需要将这些原始类型的数组转换为字符串(String)...

    Java常用类与基础API-String的构造器与常用方法

    ### Java常用类与基础API-String的构造器与常用方法 #### 一、String的常用API-1 ##### (1)构造器 1. **介绍** - `public String()`: - 初始化新创建的 `String` 对象,以使其表示空字符序列。即创建了一个...

    介绍java中String类的方法

    Java中的String类是编程中非常基础且重要的一个类,它代表不可变的字符序列,即一旦创建,其内容就不能更改。下面我们将详细讨论String类的一些主要特性、实例化方式以及常用方法。 1. **String类的实例创建**: -...

    Java程序设计基础:创建String字符串.pptx

    String类:连接、查找、比较等 引入 String是Java库中一个预定义的类,在java.lang包中。 String类型 字符串常量:双引号括起来的多个字符组成的序列,每一个字符占2个字节,在内存中共占用2n个字节,n为字符的个数...

    Java类库复习——java.lang.String

    在Java编程语言中,`java.lang.String`是最重要的类之一,它是所有字符串操作的基础。这个类位于核心类库中,因此无需显式导入即可使用。本文将深入探讨`String`类的一些关键知识点,包括它的特性、构造方法、常用...

    Java基础之字符串及String

    总的来说,理解和熟练掌握Java中的字符串操作是成为Java程序员的基础,包括创建、比较、拼接以及字符串的内存管理,这些都是编写高效且无错误的Java代码的关键。在实际开发中,根据具体需求选择合适的字符串处理方法...

    java自制string类例程

    在Java编程语言中,String类是一个非常基础且重要的部分,它是不可变的,也就是说一旦创建了一个String对象,就不能更改它的内容。然而,许多初学者在学习过程中可能会尝试自己创建一个类似的字符串类,以便更好地...

    JAVA【第5章:面向对象基础】_String类的常用方法.rar

    在Java编程语言中,面向对象基础是学习Java的基石,而`String`类则是最常用的类之一,几乎在每一个程序中都会见到它的身影。本章节将深入探讨`String`类的常用方法,帮助你更好地理解和运用这个核心组件。 `String`...

    Java_String_的方法

    ### Java字符串方法详解 #### 一、创建并初始化字符串 在Java中,字符串是一个非常重要的数据类型,通常用于处理文本信息。...这些方法不仅在日常编程中频繁使用,也是理解和掌握Java语言基础的关键部分之一。

Global site tag (gtag.js) - Google Analytics