如何在Java中比较字符串

时间:2015-07-25 07:53:12

标签: java arrays sorting

在采访中我有问题要先在LNAME中对数组进行排序,然后在不使用任何内置函数的情况下对FNAME 进行排序,如comparecompareTo,{{1} })。

Collections.sort

不幸的是,我比较了下面的字符串

String NAMES[][]={{"Abse","Blase"},{"Gua","Tysg"},{"Hysdt","Tyser"}};

而且,我开始知道,这是错误的。那么,如何在不使用任何内置函数的情况下比较它们呢?

注意:我还没有添加完整代码段。只是想知道,我们如何比较String。

3 个答案:

答案 0 :(得分:2)

根据String.class,compareTo(String s)方法声明如下。您可以参考下面的代码段,但由于compareTo方法使用Math函数,因此它不能满足您的要求。但我相信这是面试官所寻找的。

  public int compareTo(String s)
{
    int i = value.length;
    int j = s.value.length;
    int k = Math.min(i, j);
    char ac[] = value;
    char ac1[] = s.value;
    for(int l = 0; l < k; l++)
    {
        char c = ac[l];
        char c1 = ac1[l];
        if(c != c1)
            return c - c1;
    }

    return i - j;
}

答案 1 :(得分:0)

非常难以思考的问题。它更像是一项学校作业;)

   public void sort() {

        String NAMES[][] = {{"Abse", "Blase"}, {"Gua", "Blase"}, {"Gua", "Tysg"}, {"Hysdt", "Tyser"}};
        List<String[]> result = new ArrayList<>(3);

        for (String[] name : NAMES) {
            if (result.isEmpty()) {
                result.add(name);
                continue;
            }
            int addAt = 0;
            for (String[] sortedName : result) {
                if (isBefore(name, sortedName)) {
                    break;
                }
                addAt++;
            }
            result.add(addAt, name);
        }

    }

    private boolean isBefore(String[] name, String[] name2) {
        //last name
        int position = 0;

        char[] lastName1 = name[1].toLowerCase().toCharArray();
        char[] lastName2 = name2[1].toLowerCase().toCharArray();
        while (lastName1.length > position && lastName2.length > position) {
            if (lastName1[position] < lastName2[position]) {
                return true;
            } else if (lastName1[position] > lastName2[position]) {
                return false;
            }
            position++;
        }


        position = 0;
        char[] firstName1 = name[0].toLowerCase().toCharArray();
        char[] firstName2 = name2[0].toLowerCase().toCharArray();
        while (firstName1.length > position && firstName2.length > position) {
            if (firstName1[position] < firstName2[position]) {
                return true;
            } else if (firstName1[position] > firstName2[position]) {
                return false;
            }
            position++;
        }

        //equal so whatever
        return false;
    }

我有一种感觉,你可以用lambdas 很多来做到这一点,但我真的不知道

答案 2 :(得分:0)

  

<>运算符无法比较Strings,因此我们可以使用它来比较字符。

也许实现自己的字符串比较方法。它逐个字符地检查并返回具有最高值的String。

public String compare(String s1, String s2)
{
   for(int i = 0; i < Math.min(s1.length(), s2.length()); i++)
   {
        if(s1.charAt(i) > s2.charAt(i))
          return s1;
   }
     return s2;
}

完成问题的答案。

    public class GreatString {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String NAMES[][] = { { "Abse", "Blase" }, { "Gua", "Tysg" },
                { "Hysdt", "Tyser" } };
        int n = NAMES.length;
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                if (NAMES[i][0].equals(NAMES[j][0])) {
                    if (compare(NAMES[i][1], NAMES[j][1])) {
                        String[] temp = NAMES[i];
                        NAMES[i] = NAMES[j];
                        NAMES[j] = temp;
                    } else {
                        if (compare(NAMES[i][0], NAMES[j][0])) {
                            String[] temp = NAMES[i];
                            NAMES[i] = NAMES[j];
                            NAMES[j] = temp;
                        }
                    }
                }
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < NAMES[i].length; j++) {
        System.out.println(NAMES[i][j]);}}
    }

    private static boolean compare(String str1, String str2) {
        // TODO Auto-generated method stub
        int len = str1.length() < str2.length() ? str1.length() : str2.length();
        for (int i = 0; i < len; i++) {
            if (str1.charAt(i) > str2.charAt(i))
                return true;
        }
        return false;
    }
}