由于您已经实现了用户输入并显示了值,我不会考虑到这一点。
有两件事需要实现:
- 比较两个对象;
- 根据比较结果,在元素之前或之后插入其中一项。
这是两个独立的函数。
比较两个对象
看看Comparator<T> 接口。它使您可以实现对象比较的方式。 Comparator 接口的唯一方法是方法compare(String o1, String o2)。您只需确保:
- 如果两个对象的顺序相同,则返回
0。在下面的示例中,Saab 和 Jaguar 是相同的,因为我们试图仅按第二个字符排序,即 a两者兼得。
- 如果
o1“小于”o2,则返回-1。在我们的示例中,将 Saab 与 Opel 进行比较将返回 -1,因为 a 比 p“小”强>。
- 如果
o1 大于o2,则返回1。在我们的示例中,比较 Skoda 和 Jaguar 将返回 1,因为 Skoda 的第二个字符(k >) 比 Jaguar 的第二个字符(a)“更大”。
顺便说一句,在您的原始代码中,您使用了 String.compareTo() 方法,这与 Comparator<String>.compare(String, String) 方法几乎完全相同。
class MyCustomComparator implements Comparator<String>() {
@Override
public int compare(String t, String t1) {
// We assume that the strings are not null
// We also assume that the length of the
// strings is at least 2.
if (t.charAt(1) < t1.charAt(1)) {
return -1;
}
else if (t.charAt(1) > t1.charAt(1)) {
return 1;
}
else {
return 0;
}
}
}
在正确的位置插入元素
一旦您定义了自己的比较器,您唯一需要做的就是将它传递给方法Arrays.sort(T[] a, Comparator<? super T> c),该方法接受带有字符串的数组作为第一个参数,并接受您自己定义的比较器作为第二个参数。
例子:
String[] array = new String[] {
"Saab",
"Opel",
"Skoda",
"Jaguar",
"Chevrolet"
};
// Result when ordering by second char:
// Saab, Jaguar, Chevy, Skoda, Opel
// Sort the array
Arrays.sort(array, new MyCustomComparator());
如果你真的,真的,真的想避免Arrays.sort()方法,你可以重新发明*:
/** Returns a new string array with the elements sorted */
String[] sort(String[] strings, Comparator<String> c) {
List<String> sortedArray = new ArrayList<String>();
for (String str : strings) {
int i;
for (i = 0; i < sortedArray.size(); i++) {
if (c.compare(str, sortedArray.get(i)) < 0) {
sortedArray.add(i, str);
break;
}
}
if (i == sortedArray.size()) {
sortedArray.add(strings[i]);
}
}
return sortedArray.toArray(new String[0]);
}
或者,您可以使用您的原始代码进行以下修改:
void myCustomCompareTo(String s1, String s2) {
if (s1.charAt(1) < s2.charAt(1)) {
return -1;
}
else if (s1.charAt(1) > s2.charAt(2)) {
return 1;
}
else { // They're equal
return 0;
}
}
String[] sortMe(String[] strs) {
for (int i = 0; i < 5 - 1; i++) {
for (int j = 0; j < 5 - 1 - i; j++) {
if (strs[j].myCustomCompareTo(name[j + 1]) > 0) {
// Swap the two values
String temp = name[j];
strs[j] = strs[j + 1];
strs[j + 1] = temp;
}
}
}
return strs;
}
其他说明
- 我发现您很难理解给定答案的代码。我建议你开始检查
String 类。您将了解length() 和charAt(int) 方法。尤其是length()经常被使用;我建议你考虑到这一点。此外,学习Generics 也可能有所帮助。
- 我认识的几乎每个程序员都在
for 循环中使用变量i,而不是x。您也应该考虑这样做。
- 您没有使用变量
num。
-
Zbynek Vyskovsky - kvr000 使用的箭头 (->) 是 lambda expressions 的一部分。 Lambda 表达式是syntactic sugar,它们使事情更容易表达(但不一定要阅读,尤其是对于 Java 领域的新手而言)。
例如,
Arrays.sort(name,
(String left, String right) ->
left.substring(1).compareTo(right.substring(1))
);
和这个完全一样:
Arrays.sort(name, new Comparator() {
@Override
public int compare(String left, String right) {
return left.substring(1).compareTo(right.substring(1));
}
);
但其实这超出了this的范围。