Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 搜索属性值在特定范围内的对象的ArrayList_Java_Arraylist - Fatal编程技术网

Java 搜索属性值在特定范围内的对象的ArrayList

Java 搜索属性值在特定范围内的对象的ArrayList,java,arraylist,Java,Arraylist,因此,我正在扩展我在Java方面的学习 我想创建一些配对系统,就像游戏和其他相关应用程序中的配对系统一样 在这个系统中的某个时候,我想在一定的评级值范围内搜索队列中的“玩家”,我想到了几种方法来实现这一点 public Player findClosePlayerInQueue(int rating) { long startTime = System.nanoTime(); while(true) { int range = 100; for(P

因此,我正在扩展我在Java方面的学习

我想创建一些配对系统,就像游戏和其他相关应用程序中的配对系统一样

在这个系统中的某个时候,我想在一定的评级值范围内搜索队列中的“玩家”,我想到了几种方法来实现这一点

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;
}
当你的评级最终扩大到其他方面时,你可以改变