Java 搜索属性值在特定范围内的对象的ArrayList
因此,我正在扩展我在Java方面的学习 我想创建一些配对系统,就像游戏和其他相关应用程序中的配对系统一样 在这个系统中的某个时候,我想在一定的评级值范围内搜索队列中的“玩家”,我想到了几种方法来实现这一点Java 搜索属性值在特定范围内的对象的ArrayList,java,arraylist,Java,Arraylist,因此,我正在扩展我在Java方面的学习 我想创建一些配对系统,就像游戏和其他相关应用程序中的配对系统一样 在这个系统中的某个时候,我想在一定的评级值范围内搜索队列中的“玩家”,我想到了几种方法来实现这一点 public Player findClosePlayerInQueue(int rating) { long startTime = System.nanoTime(); while(true) { int range = 100; for(P
public Player findClosePlayerInQueue(int rating) {
long startTime = System.nanoTime();
while(true) {
int range = 100;
for(Player p: queuedPlayers) {
if (p.getRating() > rating - range && p.getRating() < rating + range ) {
System.out.printf("Searching took: %.3f", (startTime - System.nanoTime())/1e9 );
return p;
}
}
range += 100;
}
}
公共玩家FindClosePlayerQueue(整数等级){
long startTime=System.nanoTime();
while(true){
整数范围=100;
对于(播放器p:queuedPlayers){
如果(p.getRating()>rating-range和&p.getRating()
这是另一种方法,给定它必须满足的特定范围
public Player findClosestPlayerInQueue(int rating, int range) {
long startTime = System.nanoTime();
while(true) {
for(Player p: queuedPlayers) {
if (p.getRating() > rating - range && p.getRating() < rating + range ) {
System.out.printf("Searching took: %.3f", (startTime - System.nanoTime())/1e9 );
return p;
}
}
}
}
公共玩家FindClosestPlayerQueue(整数评级,整数范围){
long startTime=System.nanoTime();
while(true){
对于(播放器p:queuedPlayers){
如果(p.getRating()>rating-range和&p.getRating()
现在,考虑到玩家可以在任何时候加入队列,这些将以某种方式被线程化
最后,我的问题是,这是实现这些功能的最佳方式吗?我四处搜索过,但在应用范围时找不到任何相关内容
无关的额外信息:我意识到严格地说,这不是范围,因为我没有一半的值,但这不是我在这里试图解决的问题。另一件需要注意的事情是,queuedPlayers将按照它们在队列中的长度排序您知道,如果您使用多个变量来匹配其他玩家,您可能会发现搜索“最近”的其他玩家的想法很有趣 例如,您正在使用“rating”变量进行比较。这是一个单变量比较 但是,如果你有更多的变量来比较你的球员,比如力量、敏捷度等,并同时比较他们呢 如果你考虑一个多变量比较,你可以用KNN这样的东西来找到一组与你“更接近”的玩家,然后你可以从这个组中挑选一个 这里有一个完整的KNN java代码示例和解释
您知道,如果您使用多个变量来匹配另一个玩家,您可能会发现搜索“最近”的另一个玩家的想法很有趣 例如,您正在使用“rating”变量进行比较。这是一个单变量比较 但是,如果你有更多的变量来比较你的球员,比如力量、敏捷度等,并同时比较他们呢 如果你考虑一个多变量比较,你可以用KNN这样的东西来找到一组与你“更接近”的玩家,然后你可以从这个组中挑选一个 这里有一个完整的KNN java代码示例和解释
不,这不是寻找最佳匹配的好方法,原因有三:
- 如果在找到玩家之前需要大量的
增量,则第一种方法花费的时间太长+=100
- 即使第一个方法返回,也可能不会返回最佳匹配
- 如果没有玩家落入特定范围,你的第二种方法可能永远不会回来
评级的“距离”。在本例中,距离仅为Math.abs(p.getRating()-rating)
。记住距离最佳的玩家,只需排队一次,并始终返回最佳匹配:
public Player findClosePlayerInQueue(int rating) {
long startTime = System.nanoTime();
int bestDistance = Integer.MAX_VALUE;
Player res = null;
for(Player p: queuedPlayers) {
int dist = Math.abs(p.getRating() - rating);
if (dist < bestDistance ) {
bestDistance = dist;
res = p;
}
}
System.out.printf("Searching took: %.3f", (startTime-System.nanoTime())/1e9);
return res;
}
公共玩家FindClosePlayerQueue(整数等级){
long startTime=System.nanoTime();
int bestDistance=Integer.MAX_值;
Player res=null;
对于(播放器p:queuedPlayers){
int dist=Math.abs(p.getRating()-rating);
如果(距离<最佳距离){
最佳距离=距离;
res=p;
}
}
System.out.printf(“搜索时间:%.3f”,(startTime System.nanoTime())/1e9);
返回res;
}
当您的评级最终扩展到包括其他内容时,您也可以更改距离度量值,以便在N
维度中操作。您可以使用欧几里德距离、或您认为是所需“接近度”的适当度量的任何其他距离。不,这不是寻找最佳匹配的好方法,原因有三:
- 如果在找到玩家之前需要大量的
+=100
增量,则第一种方法花费的时间太长
- 即使第一个方法返回,也可能不会返回最佳匹配
- 如果没有玩家落入特定范围,你的第二种方法可能永远不会回来
您应该做的是测量与特定评级的“距离”。在本例中,距离仅为Math.abs(p.getRating()-rating)
。记住距离最佳的玩家,只需排队一次,并始终返回最佳匹配:
public Player findClosePlayerInQueue(int rating) {
long startTime = System.nanoTime();
int bestDistance = Integer.MAX_VALUE;
Player res = null;
for(Player p: queuedPlayers) {
int dist = Math.abs(p.getRating() - rating);
if (dist < bestDistance ) {
bestDistance = dist;
res = p;
}
}
System.out.printf("Searching took: %.3f", (startTime-System.nanoTime())/1e9);
return res;
}
公共玩家FindClosePlayerQueue(整数等级){
long startTime=System.nanoTime();
int bestDistance=Integer.MAX_值;
Player res=null;
对于(播放器p:queuedPlayers){
int dist=Math.abs(p.getRating()-rating);
如果(距离<最佳距离){
最佳距离=距离;
res=p;
}
}
System.out.printf(“搜索时间:%.3f”,(startTime System.nanoTime())/1e9);
返回res;
}
当你的评级最终扩大到其他方面时,你可以改变