1

配列リストがAあり、2つのオブジェクトを比較するとAしますa.getDistanceFromPlayer() < b.getDistanceFromPlayer()

Bのすべてのオブジェクトを含むリストを作成したいのですAが、最初のオブジェクトがプレーヤーに最も近く、最後のオブジェクトが最も遠い場所でソートされています。

これを行うための最速の方法は何でしょうか?

ありがとう

4

5 に答える 5

2

クラスにComparableを実装させる必要があります。

次に、Collections.sort()を使用してリストを並べ替えることができます。

ソートされたリストとソートされていないリストが必要な場合は、コピーを作成する必要があります。


もう1つのオプションは、コンパレータを作成することです。

コレクションのドキュメントを読むと、 2つの並べ替え方法があることがわかります。

1つは、オブジェクトのcompareToメソッド(つまり、オブジェクトの「自然な順序」)に基づいて並べ替えます。

もう1つは、2番目の引数として渡されるコンパレータに基づいてソートされます。


Comparableの実装例を提供する別の質問へのリンクは次のとおりです。

于 2012-11-27T22:24:35.703 に答える
2

カスタムコンパレータでCollections.sortを使用します。

eg.
public class DistanceComparator implements Comparator<Integer>{

    @Override
    public int compare(YourObject o1, YourObject o2) {
        if (o1.getDistanceFromPlayer() > o2.getDistanceFromPlayer())
        {
           return 1;
        } 
        else if (o1.getDistanceFromPlayer() < o2.getDistanceFromPlayer())
        {
           return -1;
        }
        return 0;
    }
}

次に、プログラムで、

Collections.sort(YourArrayInstance, new DistanceComparator())
于 2012-11-27T22:27:31.627 に答える
2

Comparableを実装してから、次のようにメソッドcompareTo(Object other)を定義します。

public int compareTo(Object other) {
  if( this.getDistanceFromPlayer() < other.getDistanceFromPlayer() ) {
      return -1;
  } else if( this.getDistanceFromPlayer() > other.getDistanceFromPlayer())  {
      return 1;
  }
  return 0;
}

これで、オブジェクトのリストでCollections.sort()を呼び出すことができます

于 2012-11-27T22:29:30.463 に答える
1

を使用しCustom Comparatorます:

B = Collections.sort(A, new CustomComparator());

public class CustomComparator implements Comparator<ClassA> {

    @Override
    public int compare(final ClassA a, final ClassA b) {
         //Make sure you check that neither a nor b are null..
         //..
         if (a.getDistanceFromPlayer() < b.getDistanceFromPlayer()) {
             return 1;
         } else if (a.getDistanceFromPlayer() > b.getDistanceFromPlayer()) {
             return -1;
         }
         return 0;

   }
}
于 2012-11-27T22:26:47.073 に答える
1

次のように、カスタムコンパレータを使用してArrayListを並べ替えることができます。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class Main {
    public static class Player {
        private final float distance;

        public Player (final float position) {
            this.distance = position;           
        }

        public float getDistanceFrom () {
            return distance;
        }

        @Override
        public String toString() {
            return "Player [distance=" + distance + "]";
        }
    }

    public static void main(String[] args) throws Exception {
        final ArrayList<Player> players = new ArrayList<Player> ();

        players.add (new Player (2));
        players.add (new Player (5));
        players.add (new Player (-3));
        players.add (new Player (1));

        Collections.sort(players, new Comparator<Player> () {
            @Override
            public int compare(Player o1, Player o2) {
                final float distance1 = o1.getDistanceFrom();
                final float distance2 = o2.getDistanceFrom();
                return (int) Math.signum (distance1 - distance2);
            }           
        });
        System.out.println(players);
    }
}

そしてそれのためのフィドル

于 2012-11-27T22:31:53.293 に答える