首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >2 Java方法java.lang.NullPointerException

2 Java方法java.lang.NullPointerException
EN

Stack Overflow用户
提问于 2011-02-26 19:57:03
回答 1查看 925关注 0票数 6

在下面的代码中我得到了一个错误java.lang.NullPointerException错误。

算法:

  1. ,如果n≤3用蛮力找到最近的点并停止,
  2. 找到一条垂直线V,使得输入集尽可能地分成两个大小相等的不相交子集PL和PR。指向左边或线上属于PL,指向右边或线上属于PR。这两种集合都不属于,因为集合是disjoint.
  3. Recursively,在PL中找到最近对点的距离δL,在PR中找到最近对的距离δR。
  4. 设δ= min(δL,δR)。输入集P中的一对最近点的距离要么是递归步骤中发现的点的距离(即δ),要么是PL中的一个点和PR中的一个点之间的距离。
    1. 唯一的候选点-- PL点和PR点--必须位于V线左侧的距离δ和V
    2. 右侧的距离δ的直线组成的垂直条中,YV是按不减y坐标排序的条带内的点数组(如果i≤j,则YV i i≤YV j)。
    3. 从YV中的第一个点开始,除最后一个点外,用后面的7个点检查该点的距离(如果没有7点)。如果发现一对距离严格小于δ,则将此距离分配给δ

  1. 返回δ.

底线是,它使用概念扫描线和递归找到欧几里得空间中的最近点。

现在,我必须编写的方法:

  • public static int cP(pointSet P).

这就完成了算法递归部分的准备工作,并调用了递归part.

  • public static int cPA(Point [] X, Point [] Y).的closestPairAux方法,该方法执行算法的递归部分,即大部分工作。

其他方法和类

点在平面上由类点的一个对象表示。这很明显,它把x和y坐标作为数字,这样如果P是一个点类型的对象,那么P.x和P.y

输入点集由类PointSet的一个对象表示。因为这是一个集合,所以不能重复一个点,我们不能假定元素的任何顺序。

  • public static PointSet gP(String f).

这将打开一个名为f的文件,并从it.

  • public Point nP(PointSet P).读取点。

这用于迭代P中的点,算法closestPair由method

  • public静态点closestPair(PointSet P)实现。

代码语言:javascript
运行
复制
1. if n = 2 then return (x1 − x2)^2 + (y1 − y2)^2
2. else
3. d ← 0
4. for i ← 1 to n − 1 do
5.    for j ← i + 1 to n do
6.      t ← (xi − xj)^2 + (yi − yj)^2
7.      if t < d then
8.       d ← t
9. return d

  • public static PointSet generatePoints(int n).

这将返回一组n个点,其坐标为integers.

  • public Point[] sort(char c).

这将返回数组中按坐标按非递减顺序排序的点集中的点,如参数c所示。这个参数要么取‘x’值,要么取‘y’值,否则会引发异常UnknownSortOptionException。。

这是我迄今所写的:

我决定第一个方法应该做一些琐碎的事情,n=<3,然后调用aux方法。

代码语言:javascript
运行
复制
  public static int cP(PointSet P) 
        throws TrivialClosestPairException, UnknownSortOptionException
{
           int distance = 0;// a method form the Poirnt class that calculate the square                              distance between this point and another point
           Point[] x = P.sort('x');
    Point[] x = P.sort('y');

        distance = cPA(x, y); **->here**

    return distance;

}

这个方法是按它应该定义的吗?

第二个问题:,我需要大量的时间来解决这个问题。

代码语言:javascript
运行
复制
public static int cPA(Point[] X, Point[] Y) 
        throws TrivialClosestPairException, UnknownSortOptionException
{
    if (X.length<4){
         return PointSet.nCP(new PointSet (X));

 }

    int V = X[(int) Math.ceil(( (double) X.length/2)-1)].getX();


    Point[] PL = Arrays.copyOfRange(X,(int) 0,(int) Math.ceil(X.length/2));
    Point[] PR = Arrays.copyOfRange(X,(int) Math.floor(X.length/2), (int) X.length-1);


     int distance = Math.min(cPA(PL,Y),cPAPR,Y));**->here**

    Point[] shortDist = new Point[Y.length];


       int n = 0;


     for (int i = 0; i <Y.length; i++)
{

     int A = Y[i].getY();
      if ((V-A)*(V-A) <= distance)
  {

   shortDist[n] = Y[i];

       }
    }


    for (int i =0; i< shortDist.length -1; i++)
   {


  for (int r = i+1; r <shortDist.length-1 && r< i + 7; r ++){
     distance = Math.min(d, shortDist[i].sqrDist(shortDist[r]));**->here**

 }
  }

 return distance;**->here**

 }

现在,当我定义下面的类来测试我的方法时,

代码语言:javascript
运行
复制
     public class Test{
public static void main(String [ ] args)
 {
   ClosestPair.closestPairCheck( 10, 10);

//生成大小为n的t个点集,并使用为每个集合实现的方法closestPair获得声称最近的对的平方距离。如果所有结果都正确,则返回一条报告此结果的消息,否则将报告失败。没有提供进一步的资料。注意,t必须严格为正(异常无效-否则引发NumberOfTestsException )。}}

当我给出可变距离值(我在上面注意到)时,在线程"main“java.lang.NullPointerException中得到以下异常:...What应该做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-27 02:30:59

好吧,让我们看看你的代码。首先,一个小提示:对于要在堆栈溢出(和其他stackexchange站点)上发布的代码,最好只使用缩进空间,因为选项卡看起来很糟糕。

因此,在这里,您的代码再次正确缩进(顺便说一下,Emacs与JDEE一起做了--看起来我没有正确配置它,或者它在处理代码时遇到了一些问题),并且我的评论被分散了。

代码语言:javascript
运行
复制
public static int closestPairAux(Point[] X, Point[] Y) 

那么,同样的问题:这两个参数数组的含义是什么?它们都包含着相同的观点,还是其他的观点?为什么要同时给出两个数组?当你回答这个问题时,给他们更好的名字。

除此之外,给您的方法一个文档注释。它收到了什么参数,返回了什么?(如果我理解的话,它不会返回距离,而是距离的平方。)

代码语言:javascript
运行
复制
    throws TrivialClosestPairException, UnknownSortOptionException
{
    if (X.length<4){
        return PointSet.naiveClosestPair(new PointSet (X));
    }

好的,这里有小数组的递归结束。

代码语言:javascript
运行
复制
    int V = X[(int) Math.ceil(( (double) X.length/2)-1)].getX();

如果我理解得对,你就是想在这里得到数组的中间元素。这样做会更清楚:

代码语言:javascript
运行
复制
int middleIndex = X.length/2;
int V = X[middleIndex].getX();

在Java中,整数除法的工作方式是舍入--接近于零--因此长度为20或21的数组的middleIndex都是10。(如果您想在第一种情况下为9,在除法前减去1。)

当然,您可以将它写成int V = X[X.length/2].getX();,但是您可以在接下来的两个语句中再次使用middleIndex

代码语言:javascript
运行
复制
    Point[] PL = Arrays.copyOfRange(X,(int) 0,(int) Math.ceil(X.length/2));
    Point[] PR = Arrays.copyOfRange(X,(int) Math.floor(X.length/2), (int) X.length-1);

如前所述,像以前一样使用middleIndex重写这两个代码。您也不需要将0X.length-1转换为int,它们已经转换为int。(再看一下Arrays.copyOfRange的文档- to索引是唯一的。)

在这里,你把你的X数组分成两个(大约)相同大小的数组,好的。

代码语言:javascript
运行
复制
    int distance = Math.min(closestPairAux(PL,Y),closestPairAux(PR,Y));

这是您的递归调用。你到底在这里做什么?为什么要将这些参数提供给递归调用(特别是,为什么两者都接收相同的Y数组?)

代码语言:javascript
运行
复制
    Point[] shortDist = new Point[Y.length];

    int n = 0;
    for (int i = 0; i <Y.length; i++)
        {
            int A = Y[i].getX();
            if ((V-A)*(V-A) <= distance)
                {
                    shortDist[n] = Y[i];
                }
        }

现在,您正在遍历Y数组,收集新的shortDist-array中靠近除法器的元素。

代码语言:javascript
运行
复制
    for (int i =0; i< shortDist.length -1; i++)
        {
            for (int r = i+1; r <shortDist.length-1 && r< i + 7; r ++){
                d = Math.min(d, shortDist[i].sqrDist(shortDist[r]));
            }
        }

d和以前的distance一样吗?

代码语言:javascript
运行
复制
    return d;
}

它看起来就像你算法的一个实现,是的。考虑一下我的问题,请至少在代码上运行一个编译器,以确保它没有明显的语法错误(通过键入)。在代码中的正确位置(在代码块之前)添加注释,并测试算法中的一些(可能是随机的)示例输入,将其与简单的实现进行比较(它们应该返回两个相同的结果,但希望您的结果更快)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5129365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档