对象数组排序

时间:2013-02-05 03:22:52

标签: java sorting

我理解对Int数组进行冒泡排序的概念,但是可以将气泡排序应用于对象数组吗?具体来说,我想按对象中包含的int变量进行排序。

Int数组只有1个Int或数据成员到数组的一个元素,但是对象有多个数据成员,这是让我感到困惑的部分。

我也研究了比较器,比如java的CompareTo方法。根据我从研究中学到的东西,Comparetors基本上返回了两个对象之间的价值差异。如何将其应用于排序数组?

4 个答案:

答案 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子句(并且它在硬件上也可能更快)