什么是字典词典? Java的

时间:2015-09-16 16:38:05

标签: java string compareto

Java中的compareTo()方法比较两个字符串“按字典顺序”。有人可以简单解释一下字典比较在java中是如何工作的吗?

我发现 this post 解释了< 0,== 0和> 0的三种情况;但是,我仍然感到困惑......

这是否意味着返回的int是字符串彼此形成的位置数,如果它们像字典一样按字母顺序排序?

此外,该方法如何处理区分大小写?小写字母是否在大写之前排在第一位?有这个图表吗?

例如,下面的代码生成-31的输出。这是否意味着字符串Dog距离字符串cat是-31个位置?

public static void main(String[] args) {
     Scanner keyboard = new Scanner(System.in);   

     String str1 = "Dog";

     String str2 = "cat";

     int result = str1.compareTo(str2);
     System.out.println(result);

2 个答案:

答案 0 :(得分:2)

返回的值并不重要,因为compareTo合约要返回负数,正数或0(正如您所知)。

但是,如果您真的想了解在将-31Dog(或任何其他字符串)进行比较时返回cat的原因,那么您可以直接在{{中查看该方法1}} class:

String

请记住,public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; } 是支持字符串的value数组。

char

那么这个方法是如何进行的?

  • 您可以在变量private final char value[]; 中检索两个字符串长度的最小值。
  • 您可以创建两个字符串字符数组的副本。
  • 循环遍历每个字符(验证它们是否等于),直到达到最低限制。
  • 如果同一索引处的两个字符不相等,则返回将第二个字符减去第一个字符的结果。 lim可以表示为char值(取其ascii值)并且已经订购。因此,如果第二个字符“高于”第二个字符,那么当减去负数时将返回第一个字符。如果第二个字符“低于”第一个字符,则返回正数。如果两者都是等于,则返回0。
  • 如果在为最低字符串长度循环时所有字符都是等于,则返回两个长度的减法。

在您的示例中,两个单词的首字母不相等,因此您可以将intD进行比较,这些c分别表示为6899。减去99到68,你得到-31。

所以回答这个问题:

  

这是否意味着返回的int是离开的位置数   如果字符串按字母顺序排序,则字符串彼此形成   像字典?

不,它实际上是两个不匹配的char的ascii值之间的差异或两个长度的差异。

  

此外,该方法如何处理区分大小写?小写   在大写之前排在第一位的字母?有这个图表吗?

如果您想在比较时忽略这种情况,可以使用String#compareToIgnoreCase

您还可以检查this chart是否有ascii值(大写和小写)。

答案 1 :(得分:1)

我发现Wikipedia's Definition of Lexicographical order在回答您的问题时非常有用。

以简单的方式,比较是进行字母比较的数字结果。在字母比较中,我们比较构成序列的有序字母集(通常是单词或字符串)。如果两者相等则返回值为0,并且&lt;或者&gt;取决于哪个值按字母顺序排列在另一个之前或之后。

列出一个单词:

  • 动物
  • 土豚

如果我们比较这些,我们采取每个的第一个字符并查看。当我们比较“猫”时和'&#39; dog&#39;,我们采取第一个角色&#39; c&#39;并且&#39; d&#39;并比较它们。在数字代码中,简单(不一定是最好的)方法是将它们转换为数值并从另一个值中减去一个值。如果它们相同,则它将等于0,并且我们将比较每个中的下一个字符。如果它们不同,那么我们知道一个是按字母顺序排列的(按字母顺序排列)。

不需要返回值 以获得任何有见地的信息。这就是为什么唯一具有任何意义的值是&lt; 0,== 0和&gt; 0 的原因。

关于套管,这是一个实施细节 - 有一些比较器会考虑大写&#39; A&#39;与小写字母相同&#39; a&#39;并且有比较器不具备,因为它们具有不同的数值。 (见:How to sort alphabetically while ignoring case sensitive?)。