我理解对Int
数组进行冒泡排序的概念,但是可以将气泡排序应用于对象数组吗?具体来说,我想按对象中包含的int
变量进行排序。
Int数组只有1个Int或数据成员到数组的一个元素,但是对象有多个数据成员,这是让我感到困惑的部分。
我也研究了比较器,比如java的CompareTo方法。根据我从研究中学到的东西,Comparetors基本上返回了两个对象之间的价值差异。如何将其应用于排序数组?
答案 0 :(得分:1)
Comparator<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
一样,你会做if (x.compareTo(y) < 0)
,但这是相同的故事,你不关心如何实际计算排序,你只需要依靠compareTo
方法。
实际上,您可以编写一个冒泡排序方法,该方法可以对每个可比较的类进行排序。例如:
public sort(Comparable<?>[] data) {
.. code
}
答案 1 :(得分:0)
这是一种思考你的困惑的方法:
想象一下,我有一组带有数字的方框。在框中有许多对象:大,小,红,绿......如果我要求你按照它们的数字对方框(“对象”)进行排序,你就没有问题了。如果我让你看到盒子内部,并按照绿球的大小排序,你可能会这样做。在任何一种情况下,你都在排序对象......
答案 2 :(得分:0)
也许这可以帮助您解决困惑:
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;
}
}
}
答案 3 :(得分:0)
实现Comparator的对象不会返回任何差异。当它大于另一个对象时它只返回一个正数,当它更小时它返回一个负数。这就是所有排序功能所关心的。 您可以对一组对象进行排序(实现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子句(并且它在硬件上也可能更快)