按LastName排序二维字符串数组,然后在FirstName上排序,而不使用任何API



大家好,我是Java的新手。我想按LastName排序下面的字符串数组,然后在FirstName上不使用任何API,即我不应该使用Arrays.sort(), compareTo(), equals()等。

输入数组字符串

String [][]name={{"Jen","Eric"},
              {"Brain","Adams"},
              {"Jon","Methew"},
              {"Antino","Ronald"},
              {"Cris","Ronald"}
             };

我的输出应该是。

             Brain,Adams
             Jen,Eric
             Jon,Methew
             Antino,Ronald
             Cris,Ronald

请帮助。

public class StringArraySort {
public static void main(String[] args) {

    //System.out.println(str.length);
    String [][]name={{"Jen","Eric"},
            {"Brain","Adams"},
            {"Jon","Methew"},
            {"Antino","Ronald"},
              {"Cris","Ronald"}
           };
    String []str1= new String [name.length];
    String []str2= new String [name.length];
    for(int i=1;i<name.length;i++)
    {
        int j=i;
        str1[i]=name[i][j];
        str2[i]=name[i-1][j];
        //System.out.println(str1[i]+" "+str2[i]);

    }
    /*for(String tmp:name)
    {
        char a[] = new char[tmp.length()] ;
        //System.out.println(tmp);
        for(int i=0;i<tmp.length();i++)
        {
            a[i]=tmp.charAt(i);
            System.out.println(a[i]);
        }
    }*/
}

}

我不会给你任何代码,因为这显然是一个赋值,但这里有一些一般的指导:

  1. 不要试图把所有东西都放进main。您可能不被允许使用任何现有的API,但您可以定义自己的API !编写自己的comparesort方法
  2. compare(String, String) -> intisSmaller(String, String) -> boolean方法开始。使用String.toCharArray从两个字符串中获取单个字符并成对比较它们。确保处理字符串长度不同的情况。
  3. 现在写一个方法compare(String[], String[]) -> int。这看起来与上面的非常相似(实际上,您可以为两者都创建一个通用的),但是针对"lastname-firstname"情况创建一个特定的示例可能更简单,特别是因为这里您希望首先按第二个元素排序。最后,编写自己的排序方法。就地冒泡排序应该是最简单的,而且算法可以很容易地在互联网上找到。其他排序算法更快,但如果速度是一个问题,那么不使用任何API的要求首先是无意义的。如果你想获得额外的积分,你可以尝试实现一个就地快速排序,但是只有在你用冒泡排序运行它之后。

同样,您应该单独测试每个方法。在确保compare方法实际工作之前,不要尝试运行sort方法。使用不同的输出分别调用它们,看看它们是否产生正确的结果。

public class NameSort {
    public static void main(String[] args) {
        String [][] names={{"Jen","Eric"},
          {"Brain","Adams"},
          {"Jon","Methew"},
          {"Antino","Ronald"},
          {"Cris","Ronald"}
         };
        for(int m=0;m<names.length;m++)
        {
            for(int n=m+1;n<names.length;n++)
            {
                if(myCompare(names[m][1],names[n][1])==1)
                {
                    swap(names, names[m], names[n], m, n);
                }
                else if (myCompare(names[m][1],names[n][1])==0)
                {
                    if(myCompare(names[m][0],names[n][0])==1)
                    {
                        swap(names, names[m], names[n], m, n);
                    }
                }
            }
        }
        for (int i=0;i<names.length;i++)
        {
            System.out.println(names[i][0]+" " +names[i][1] );
        }
    }
    public static void swap(String [][] names,String[] a,String[] b,int m,int n)
    {
        names[n]=a;
        names[m]=b;
    }
    public static int myCompare(String a, String b)
    {
        int minLength= a.length()<b.length()?a.length():b.length();
        for(int i=0;i<minLength;i++)
        {
            if(a.charAt(i)>b.charAt(i))
            {
                return 1;
            }
            else if(a.charAt(i)<b.charAt(i)){
                return -1;
            }
        }
        if(a.length()>minLength)
            return 1;
        else if (b.length()> minLength )
            return -1;
        else
            return 0;
    }
}

为了让您至少学到一些东西,我将以伪代码的形式给出答案,并让您自己编写代码。解决方案是基于冒泡排序和通过循环它们的字符

来比较名称(= string)。

在冒泡排序中,我们遍历数组,在每次迭代中,我们比较两个相邻的单元格,并可能交换它们以使它们处于正确的顺序。在第一次迭代结束时,最大的单元格将位于正确的位置(=最后)。所以我们开始另一次迭代,但是跳过最后一个单元格。在第二次迭代结束时,第二大单元将处于正确位置。我们继续迭代,每次都少遍历一个单元格,直到没有更多的单元格需要迭代。

我给你比较方法:解决方案假定允许调用String类的length()charAt()方法。

/**
 * returns negative, zero or positive value 
 * if s1 is smaller, equal or bigger than s2, respectively
 * comparison is lexicographical
 */
static int compareStrings(String s1, String s2)
{
    int i = 0;
    for (i = 0; i < s1.length() && i < s2.length(); i++) {
        int diff = s1.charAt(i) - s2.charAt(i);
        if (diff != 0) return diff;
    }
    if (i == s1.length()) {
        if (i == s2.length()) return 0; // equal lengths
        else return 1; // exhausted s2 before s1
    }
    return -1; // exhausted s1 before s2
}

看到代码中的循环,我认为最后一个注意事项是有序的:您应该意识到Java中的数组从索引0开始,最后一个单元格的长度为1。

最新更新