-1

配列のバブルソートの概念は理解してIntいますが、オブジェクトの配列にバブルソートを適用することは可能ですか? int具体的には、オブジェクトに含まれる変数で並べ替えたいと考えています。

Int配列には、配列の1つの要素に対して1つのIntまたはデータメンバーしかありませんが、オブジェクトには複数のデータメンバーがあり、それが本当に混乱する部分です。

また、Java の CompareTo メソッドなどの Comparetor についても調べました。調査から学んだことによると、Comparetors は基本的に 2 つのオブジェクトの値の差を返します。これを配列のソートに適用するにはどうすればよいですか?

4

4 に答える 4

1

AComparator<T>は、2 つのオブジェクトの違いを返しません。の 2 つのそれぞれのインスタンスの順序を返しますT

ドキュメントに記載されているように:

最初の引数が 2 番目の引数より小さい、等しい、または大きい場合、負の整数、ゼロ、または正の整数を返します。

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
  }

これで、バブル ソートを簡単に実装できます。sif (x < y)で行うようにを直接実行する代わりに、それは同じ話であり、順序付けが実際にどのように計算されるかは気にせず、メソッドに依存するだけです。intif (x.compareTo(y) < 0)compareTo

実際には、比較可能なすべてのクラスでソートを実行できるバブル ソート メソッドを作成できます。例えば:

public sort(Comparable<?>[] data) {
  .. code
}
于 2013-02-05T03:30:06.903 に答える
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;
  }
 }
}
于 2013-02-05T03:32:32.997 に答える
0

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 句をすべて記述するよりも簡単です (ハードウェアでもおそらく高速です)。

于 2013-02-05T03:34:00.217 に答える
0

混乱について考える方法は次のとおりです。

数字が書かれた箱のセットがあると想像してください。箱の中には、大きなもの、小さなもの、赤、緑など、たくさんの物が入っています。箱(「物」)を番号順に並べ替えても問題ありません。代わりに、箱の中を見て、緑色のボールの大きさで並べ替えてくださいと言ったら、おそらくそれができるでしょう. どちらの場合でも、オブジェクトを並べ替えています...

于 2013-02-05T03:29:57.607 に答える