2016-04-23 4 views
1

私はProcessingを使用しています。どのようにオブジェクト自体のオブジェクトであるフィールドでカスタムオブジェクトのコレクションをソートしますか?

public void sortEnemies(final String field, List<Enemy> itemLocationList) { 
    Collections.sort(itemLocationList, new Comparator<Enemy>() { 
     @Override 
     public int compare(Enemy o1, Enemy o2) { 
     if (field.equals("r")) { 
      if (o1.r<o2.r) 
      { 
      return -1; 
      } 
      if (o1.r>o2.r) 
      { 
      return 1; 
      } 
      if (o1.r==o2.r) 
      { 
      return 0; 
      } 
     } 

     println("shoudl not have reached here."); 
     return 0; 
     } 
    } 
    ); 
    } 

は、そのような彼らの半径rなどのプリミティブフィールドで私が持っているこれらの敵をソートするためのコンパレータを使用するのに十分に簡単です。私がしたいのはこれです:それぞれの敵はlocというプリミティブフィールドloc.xとloc.yを持つlocというPVectorオブジェクトを持っています。オブジェクト内のPVectorオブジェクトでソートするには、このコードをどのように変更しますか?それは可能ですか?私はちょうど、例えば、彼らのxまたはy座標で並べ替えるのが好きですが、私は同様の方法でそれを書く方法がわかりません。

本質的には、問題は次のとおりです。オブジェクトの配列自体を並べ替えるフィールドを持つオブジェクトで並べ替える方法。

編集:私はここにも同様の問題 Sort ArrayList of custom Objects by property

があることがわかりますが、私は、処理は、Java 8(わからない)を使用しないと思いますので、ラムダ表記を使用する必要はありません。私はPVectorクラスを変更することはできません。私はPVectorオブジェクトのリストをソートする方法を作りましたが、それは敵のpvectorのリストを作成し、そのインデックスを取得し、それらのインデックスで敵をソートするという非常にラウンドアバウトな方法のようです。コメントフィードから

+0

Java 8などを使用していますか? –

+0

Processing 3.0に付属しているjavaのバージョンを使用しています。申し訳ありませんが、私はそれを見ていない – user3772547

+0

実際には、javaと処理[同じものではありません](http://meta.stackoverflow.com/q/321127/472647) – CodeMouse92

答えて

1

:私はsortEnemies(「X」、listofenemiesを)言うことができ、フィールドと呼ばれる文字列を渡したい

。また、sortEnemies( 'r'、listofenemies);

私はそうのように、比較器にフィールド名のマッピングを行うことをお勧め:

Map<String, Comparator<Enemy>> comparators = new HashMap<>(); 

comparators.put("health", new Comparator<Enemy>() { 
    @Override 
    public int compare(Enemy o1, Enemy o2) { 
     if (o1.health < o2.health) 
      return -1; 
     if (o1.health > o2.health) 
      return 1; 
     return 0; 
    } 
}); 

comparators.put("x", new Comparator<Enemy>(){ 
    @Override 
    public int compare(Enemy o1, Enemy o2) { 
     if (o1.loc.x < o2.loc.x) 
      return -1; 
     if (o1.loc.x > o2.loc.x) 
      return 1; 
     return 0; 
    } 
}); 

、あなたのアイテムをソートしたい場合には、名前で適切なコンパレータを取得:

Comparator<Enemy> comparator = comparators.get("x"); 
if (comparator == null) 
    throw new RuntimeException("No such comparator exists!"); 
Collections.sort(itemLocationList, comparator); 

私は完全に名前を修飾することをお勧めします。つまり、単に "x"ではなく "loc.x"を名前として使用することをお勧めしますが、それを入れて取得するときに同じ名前を使用する限り、でる。

この回答は元の回答とは多少異なりますが、下の[編集済み]リンクをクリックするとさまざまなバージョンが表示されます。

+0

私はそれが働いたので、答えを受け入れています。 (EnemeyをEnemyに改名するだけでなく、o1.rをo1.xに修正する必要があります)。解説のために、他のフィールドでソートできるようにするには、新しい比較メソッドを追加するか、単にStringというフィールドを追加して、上の例のようにしますか? – user3772547

+0

私は最後のビットを完全に理解しているかどうかはわかりません...私は答えを更新しますが、まだ明確でない場合は、再度コメントします。 –

+0

申し訳ありませんが私は別の言い方でそれを言わせてください。フィールドと呼ばれるStringを渡したいと思います。ここで私はsortEnemies( 'x'、listofenemies)と言うことができます。また、sortEnemies( 'r'、listofenemies); xは私たちが行ったpvectorのメンバーです。 rは敵のメンバーです。メソッドのシグネチャが異なるため、別のcompareメソッドを実装する必要がありますか? – user3772547

関連する問題