【问题标题】:String Comparison in JavaJava中的字符串比较
【发布时间】:2011-05-03 03:40:36
【问题描述】:

“按字典顺序比较两个字符串”是什么意思?

【问题讨论】:

    标签: java string-comparison lexicographic lexicographic-ordering


    【解决方案1】:

    您可能还会遇到一项任务,您必须“手动”实现字典比较,而不是使用默认的 compareTo() 方法。

    下面的简单算法是基于比较后续位置的字符的 Unicode 值。

    @Override
    public int compareTo(Person otherPerson) {
            
    // Getters, constructor, variables ... 
    
            int result = 0;
    
                for (int i = 0; i < getName().length() && i < otherPerson.getName().length(); i++) {
                    if (getName().charAt(i) > otherPerson.getName().charAt(i)) {
                        result = 1;
                        break;
                    } else if (getName().charAt(i) < otherPerson.getName().charAt(i)) {
                        result = -1;
                        break;
                    }
                }
            }
            return result;
        }
    }
    

    【讨论】:

      【解决方案2】:

      在算法下面“按字典顺序比较两个字符串”

      1. 输入两个字符串字符串1和字符串2。

      2. for (int i = 0; i

        (循环遍历两者的每个字符 字符串比较它们直到一个 字符串终止):

        一个。如果两个字符的 unicode 值 相同然后继续;

        b.如果字符的 unicode 值 字符串 1 和字符串 2 的 unicode 值 不同则返回 (str1[i]-str2[i])

      3. 如果字符串 1 的长度小于字符串 2

        返回 str2[str1.length()]

        否则

        返回 str1[str2.length()]

        // 此方法按字典顺序比较两个字符串

        public static int compareCustom(String s1, String s2) {
            for (int i = 0; i < s1.length() && i< s2.length(); i++) {
                if(s1.charAt(i) == s2.charAt(i)){
                    //System.out.println("Equal");
                    continue;
                }
                else{
                    return s1.charAt(i) - s2.charAt(i);
                }   
            }
            if(s1.length()<s2.length()){
                return s2.length() - s1.length();
            }
            else if(s1.length()>s2.length()){
                return s1.length()-s2.length();
            }
            else{
                return 0;
            }
        }
        

      如果两个字符串相等则返回 0 否则返回 Negative 或 正值

      来源:-Source

      【讨论】:

        【解决方案3】:

        根据@Bozho 和@aioobe 的答案,字典比较类似于人们可能在字典中找到的顺序。

        Java String 类提供了.compareTo () 方法以按字典顺序比较字符串。像这样使用"apple".compareTo ("banana")

        这个方法的返回是一个int,可以解释如下:

        • 返回
        • 返回 == 0 则两个字符串在字典上是等价的
        • 返回 > 0,则传递给 compareTo 方法的参数按字典顺序排列。

        更具体地说,该方法提供了 ASCII 值的第一个非零差异。

        因此"computer".compareTo ("comparison") 将返回值(int) 'u' - (int) 'a' (20)。由于这是一个肯定的结果,因此参数 ("comparison") 按字典顺序排在第一位。

        还有一个变体.compareToIgnoreCase (),例如,它会为"a".compareToIgnoreCase ("A"); 返回0

        【讨论】:

        • 有关排序规则比较(即 'é' 等同于 'e')请查看 download.oracle.com/javase/1.5.0/docs/api/java/text/…
        • 只是一件小事。 "computer".compareTo ("comparison") 将返回值 (int) 'u' - (int) 'a' 20。不是 (21)。
        • 字典的语言也很重要。这就是 Locale 的用途。
        【解决方案4】:

        “比较”一词具有轻微的误导性。您不是在比较严格相等,而是在字典(词典)中哪个字符串排在第一位。

        这是允许对字符串集合进行排序的功能。

        请注意,这非常取决于活动的语言环境。例如,在丹麦,我们有一个字符“å”过去拼写为“aa”,与两个单个 a 非常不同(编辑:如果 发音为 “一种”!)。因此,丹麦排序规则将两个连续的 a 等同于“å”,这意味着它在 z 之后。这也意味着丹麦语词典的排序方式与英语或瑞典语词典不同。

        【讨论】:

        【解决方案5】:

        Java 字典顺序:

        1. 数字-之前-
        2. 大写-之前-
        3. 小写

        这看起来很奇怪,但确实如此...
        我不得不编写比较器链才能更改默认行为。
        使用更好的输入字符串示例来尝试以下 sn-p 以验证顺序(您将需要 JSE 8):

        import java.util.ArrayList;
        
        public class HelloLambda {
        
        public static void main(String[] args) {
            ArrayList<String> names = new ArrayList<>();
            names.add("Kambiz");
            names.add("kambiz");
            names.add("k1ambiz");
            names.add("1Bmbiza");
            names.add("Samantha");
            names.add("Jakey");
            names.add("Lesley");
            names.add("Hayley");
            names.add("Benjamin");
            names.add("Anthony");
        
            names.stream().
                filter(e -> e.contains("a")).
                sorted().
                forEach(System.out::println);
        }
        }
        

        结果

        1Bmbiza
        本杰明
        海莉
        杰基
        坎比兹
        萨曼莎
        k1ambiz
        坎比兹

        请注意,这是特定于区域设置的答案。
        请注意,我正在过滤包含小写字母 a 的名称。

        【讨论】:

          【解决方案6】:

          如果您检查哪个字符串将在词典中排在第一位,那么您已经完成了字符串的词典比较!

          一些链接:

          从后面的链接偷来的:

          如果字符串 s 按字典顺序在字符串 t 之前

          • st 的前缀,或
          • 如果cd分别是st的第一个字符,其中s t 不同,则 c 按字符顺序在 d 之前。

          注意:对于字母字母的字符,字符顺序与字母顺序一致。数字在字母之前,大写字母在小写字母之前。

          例子:

          • 房子先于家庭
          • 家先于家
          • 作曲家先于计算机
          • H2O 先于 HOTEL

          【讨论】:

            【解决方案7】:

            按顺序比较位置相同的字母.. 更像是您在字典中排序单词的方式

            【讨论】:

              【解决方案8】:

              String.compareTo(..) 方法执行字典比较。按字典顺序 == 按字母顺序。

              【讨论】:

                猜你喜欢
                • 2014-11-11
                • 2012-06-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多