1

假设我有 arraylistA并比较AI do的 2 个对象a.getDistanceFromPlayer() < b.getDistanceFromPlayer()

我现在想要B一个包含所有A对象的列表,但在第一个对象最接近玩家的位置排序,最后一个对象最远。

最快的方法可能是什么?

谢谢

4

5 回答 5

2

你应该让你的班级实现Comparabl e

然后您可以使用Collections.sort()对您的列表进行排序。

如果你想要一个排序的列表一个未排序的列表,你必须制作一个副本。


另一种选择是创建一个Comparator

如果您阅读Collections 的文档,您会看到它有两种排序方法。

一种基于对象的compareTo方法(即它们的“自然顺序”)进行排序。

另一个基于作为第二个参数传递的 Comparator 进行排序。


这是另一个问题的链接,它提供了 Comparable 的示例实现:

于 2012-11-27T22:24:35.703 回答
2

Use Collections.sort with a custom comparator.

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;
    }
}

Then in your program, call

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

让 A 实现 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

您可以使用自定义Comparator并对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 回答