大家好,我是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]);
}
}*/
}
}
我不会给你任何代码,因为这显然是一个赋值,但这里有一些一般的指导:
- 不要试图把所有东西都放进
main
。您可能不被允许使用任何现有的API,但您可以定义自己的API !编写自己的compare
和sort
方法 - 从
compare(String, String) -> int
或isSmaller(String, String) -> boolean
方法开始。使用String.toCharArray
从两个字符串中获取单个字符并成对比较它们。确保处理字符串长度不同的情况。 现在写一个方法
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。