两个.compareTo方法问题?

时间:2015-04-05 01:51:17

标签: java string

我搜索了Java中使用的词典排序的完整表格,但没有用。

我找到整理模式。但我需要的是一个包括大写和小写字母,数字,运算符,空格的字母。

我知道空间是排序中的第一个,剩下的就是什么?

完成我的第一个问题,我的第二个问题是:

compareTo方法返回的数字到底告诉您什么?

对于前。相隔多少个字母是两个不同单词的相同索引的两个字母?

2 个答案:

答案 0 :(得分:2)

第1部分

比较基于字符串中每个字符的Unicode值。所以基本上,compareTo()将每个字符串视为一系列16位无符号整数。这是一个Unicode chart,因此您可以看到它们的顺序。

参考:String.compareTo doc

第2部分

基本上,没有人知道compareTo返回值的大小是什么,只是符号。在实践中,大多数compareTo实现将返回-1,0或1,但合同明确表示正面或负面,您应该相应地编写代码(例如,使用int compare = a.compareTo(b); if(compare > 0) {...} else...)

根据String.compareTo doc

  

在这种情况下,compareTo返回两个字符串中位置k>的两个字符值的差值 - 即值:

this.charAt(k)-anotherString.charAt(k)
     

如果没有它们不同的索引位置,那么较短的字符串按字典顺序排在较长的字符串之前。在这种情况下,compareTo返回字符串长度的差异 - 即值:

this.length()-anotherString.length()

参考:String Compareto actual return value

答案 1 :(得分:0)

您可以使用非ascii代码替换空格

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test1 {
    public static void main(String[] args) {
        List<String> data = new ArrayList<String>(Arrays.asList(
                "pqrst",
                "Abcdef",
                "Lmno",
                " uvw",
                "xyz",
                "Ghijk"
        ));
        Collections.sort(data, new MyDataComparator());
        for (String s : data) {
            System.out.println(s);
        }
    }
}

class MyDataComparator implements Comparator<String> {
    @Override
    public int compare(String s1, String s2) {
        String regex = " ";
        byte[] b = { (byte) 0x80 };  // out of ascii code
        Pattern p = Pattern.compile(regex);
        Matcher m1 = p.matcher(s1);
        Matcher m2 = p.matcher(s2);
        String r1 = m1.replaceAll(new String(b));
        String r2 = m2.replaceAll(new String(b));
        return r1.compareTo(r2);
    }
}

输出是:

Abcdef
Ghijk
Lmno
pqrst
xyz
 uvw