80

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

4

8 回答 8

163

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

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

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

  • 返回 < 0 然后调用该方法的字符串按字典顺序排在第一位(在字典中排在第一位)
  • 返回 == 0 那么这两个字符串在字典上是等价的
  • 返回 > 0,则传递给该compareTo方法的参数按字典顺序排列。

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

因此"computer".compareTo ("comparison")将返回(int) 'u' - (int) 'a'(20) 的值。因为这是一个肯定的结果,所以参数 ( "comparison") 在字典上是第一位的。

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

于 2010-10-31T19:40:00.770 回答
11

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

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

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

于 2010-10-31T19:29:53.733 回答
8

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

于 2010-10-31T19:14:31.660 回答
8

依次比较具有相同位置的字母..更像是您在字典中排序单词的方式

于 2010-10-31T19:14:32.643 回答
6

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

一些链接:

从后一个链接窃取:

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

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

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

例子:

  • 房子先于家庭
  • 家先于家
  • 作曲家先于计算机
  • H2O 先于酒店
于 2010-10-31T19:10:07.340 回答
4

Java 字典顺序:

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

看起来很奇怪,这是真的……
我不得不编写比较器链才能更改默认行为。
使用以下代码段和更好的输入字符串示例来验证顺序(您将需要 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
Benjamin
Hayley
Jakey
Kambiz
Samantha
k1ambiz
kambiz

请注意,这是特定于语言环境的答案。
请注意,我正在过滤包含小写字母 a 的名称。

于 2016-11-26T13:49:02.790 回答
0

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

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

  2. for (int i = 0; i < str1.length() && i < str2.length(); i ++)

    (遍历两个字符串的每个字符进行比较,直到其中一个字符串终止):

    一种。如果两个字符的 unicode 值相同,则继续;

    湾。如果字符串 1 的字符的 unicode 值和字符串 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 否则返回负值或正值

来源: -来源

于 2019-08-20T08:02:54.373 回答
0

您可能还会遇到一项任务,您必须“手动”实现字典比较,而不是使用默认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;
    }
}
于 2021-09-23T09:47:47.580 回答