我了解对数组进行冒泡排序的概念,Int
但是是否可以将冒泡排序应用于对象数组?具体来说,我想按int
对象中包含的变量进行排序。
Int 数组只有 1 个 Int 或数组的一个元素的数据成员,但 Objects 有多个数据成员,这才是真正让我感到困惑的部分。
我还研究了比较器,例如 java 的 CompareTo 方法。从我对它的研究中了解到,比较器基本上返回两个对象之间的价值差异。如何将其应用于对数组进行排序?
AComparator<T>
不返回两个对象之间的差异。它而是返回T
.
正如文件所述:
返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个。
OOP 的好处是您能够封装数据和行为,这种情况就是一个明显的例子。让我们看看这个样板代码:
class HugeClass implements Comparable<HugeClass> {
// lots of variables
public int compareTo(HugeClass o) {
// lots of code to decide if this instance is lesser, equal or greater than o
// then we return -1, 0 or 1 accordingly
}
现在您可以轻松实现冒泡排序。取而代之的是直接做if (x < y)
,就像你对int
s 做的那样if (x.compareTo(y) < 0)
,但这是同一个故事,你不关心实际如何计算排序,你只依赖于compareTo
方法。
实际上,您可以编写一个冒泡排序方法,该方法能够对每个可能的可比较类执行排序。例如:
public sort(Comparable<?>[] data) {
.. code
}
也许这可以帮助您解决困惑:
public class Test {
public static A a1 = new A("001", "a", "wa~", 7);
public static A a2 = new A("001", "c", "wa~", 9);
public static A a3 = new A("001", "b", "wa~", 3);
public static A a4 = new A("000", "d", "wa~", 6);
public static void main(String[] args) {
A[] voA = new A[] { a1, a2, a3, a4 };
java.util.Arrays.sort(voA, new Mycomparator());
A[] newA = new A[voA.length];
for (int i = 0; i < voA.length; i++)
System.out.println("[" + i + "]:" + voA[i].A1 + " " + voA[i].A2 + " " + voA[i].A3 + " " + voA[i].A4);
}
}
class A {
String A1;
String A2;
String A3;
int A4;
public A(String oA1, String oA2, String oA3, int oA4) {
this.A1 = oA1;
this.A2 = oA2;
this.A3 = oA3;
this.A4 = oA4;
}
}
class Mycomparator implements java.util.Comparator {
public int compare(Object o1, Object o2) {
A a1 = (A) o1;
A a2 = (A) o2;
if(a1.A1.compareTo(a2.A1)!=0) {
return a1.A1.compareTo(a2.A1);
} else if(a1.A2.compareTo(a2.A2)!=0) {
return a1.A2.compareTo(a2.A2);
} else if(a1.A3.compareTo(a2.A3)!=0) {
return a1.A3.compareTo(a2.A3);
} else {
return a1.A4 >a2.A4?1:a1.A4==a2.A4?0:-1;
}
}
}
实现 Comparator 的对象不会返回任何类型的差异。当它大于另一个对象时它只返回一个正数,当它小于另一个对象时返回一个负数。这就是 sort 函数所关心的。您可以对对象数组进行排序(实现 Comparable 如下)
class MyObject implements Comparable<MyObject>{
int myInt;
public int compareTo(MyObject other){
if(myInt>other.myInt)
return 1;
else if(myInt<other.myInt)
return -1;
else if(myInt==other.myInt)
return 0;
else
throw new Error("This should never happen");
}
}
那么如果你有一个数组
MyObject[] arr;
你可以用它排序
Arrays.sort(arr);
人们接受差异的唯一原因是因为它写起来更快
myInt - other.myInt
比编写所有那些 if-else 子句(而且在硬件上也可能更快)
这是一种思考您的困惑的方法:
想象一下,我有一组带有数字的盒子。盒子里有很多物体:大的、小的、红色的、绿色的……如果我让你按照盒子上的数字对盒子(“物体”)进行排序,你就没有问题了。如果我让你查看盒子内部,并按照绿球的大小对它们进行分类,你可能会这样做。无论哪种情况,您都在对对象进行排序...