0

次のように抽象クラスを定義しました。

public abstract class Move implements Comparable<Move> {
protected int cell;
protected int weight;       

public int getWeight()
{
    return this.weight;
}

public void setWeight(int value)
{
    this.weight = value;
}

protected Move(int cell)
{
    this.cell = cell;
    this.weight = 0;
}

protected Move(int cell, int weight)
{
    this.cell = cell;
    this.weight = weight;
}

@Override
public int compareTo(Move m) 
{
    return this.weight - m.weight;
}

このクラスを拡張する追加の 2 つのクラスがあります (MoveLeft および MoveRight クラス)。両方のタイプのオブジェクトを Move タイプの List に追加し、Collections.sort を使用して並べ替えます。

List<Move> moves = new ArrayList<Move>(someSize);
moves.add(new MoveLeft(cell1));
moves.add(new MoveRight(cell2));
moves.add(new MoveRight(cell3));
moves.add(new MoveLeft(cell4));
Collections.sort(moves);

ただし、リストは重みではなくセルでソートされています。

サブクラス化された異なるインスタンスを同じソートに混在させることはできませんか?

注: サブクラス化されたコンストラクターの重みに一意の値を設定しています。

4

2 に答える 2

0

Move の配列を作成して、Move にアップキャストする派生クラスの混合物を挿入し、通常どおりソートする必要があります。その後、isntanceOf と downcast を使用して実際のクラスを確認できます。

于 2013-03-15T13:30:29.730 に答える
0

これは、答えではなく、非常に長いコメントです。

簡単なテスト プログラムを作成しましたが、正しくソートされているように見えます。出力は[Move [cell=10, weight=1], Move [cell=1, weight=100]]、要素を追加した順序でもセルの昇順でもなく、重みの昇順です。

同じ型の 2 つのコンストラクター パラメーターがあることに注意してください。それらが切り替えられていないことを非常に注意深く確認することをお勧めします。それが問題でない場合は、テスト プログラムを変更して、問題が再現されるまで実際のコードに近づけることをお勧めします。ここに私のテストプログラムがあります:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Test {
  public static void main(String[] args) {
    List<Move> list = new ArrayList<Move>();
    list.add(new MoveRight(1, 100));
    list.add(new MoveLeft(10, 1));
    Collections.sort(list);
    System.out.println(list);
  }
}

abstract class Move implements Comparable<Move> {
  protected int cell;
  protected int weight;

  public int getWeight()
  {
    return this.weight;
  }

  public void setWeight(int value)
  {
    this.weight = value;
  }

  protected Move(int cell)
  {
    this.cell = cell;
    this.weight = 0;
  }

  protected Move(int cell, int weight)
  {
    this.cell = cell;
    this.weight = weight;
  }

  @Override
  public int compareTo(Move m)
  {
    return this.weight - m.weight;
  }

  @Override
  public String toString() {
    return "Move [cell=" + cell + ", weight=" + weight + "]";
  }
}

class MoveLeft extends Move {

  protected MoveLeft(int cell, int weight) {
    super(cell, weight);
  }

}

class MoveRight extends Move {

  protected MoveRight(int cell, int weight) {
    super(cell, weight);
  }

}
于 2013-03-15T13:43:05.763 に答える