草庐IT

java - 2个Java方法java.lang.NullPointerException

coder 2024-04-02 原文

我在以下代码上收到错误java.lang.NullPointerException错误。

算法:

  • 如果n≤3,则通过蛮力找到最接近的点并停止。
  • 找到一条垂直线V,以将输入集分成两个不相交的子集PL和PR,它们的大小尽可能相等。左边或线上的点属于PL,右边或线上的点属于PR。因为集合是不相交的,所以任何点都不属于两者。
  • 递归地找到PL中最接近的点对的距离δL和最接近的点的距离δR
    在PR中配对。
  • 令δ= min(δL,δR)。输入集合P中的一对最接近点的距离或者是在递归步骤中找到的点的距离(即δ),或者由PL中的点和PR中的点之间的距离组成。
  • 来自PL的唯一候选点和来自PR的唯一候选点必须位于由
    V线左侧的距离δ和V右侧的距离δ的线
  • 令YV为带内点的数组,并按不减小的y坐标排序
    (即,如果i≤j,则YV [i]≤YV [j])。
  • 从YV中的第一个点开始,然后穿过除最后一个点以外的所有点,然后检查下一个7点(如果不多于7个则剩下的点)与该点的距离。如果发现一对距离严格小于δ,则将该距离分配给δ。
  • 返回δ。

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

    现在,我必须编写的方法:
  • public static int cP(pointSet P).
    这确实为算法的递归部分提供了准备工作的方法,并为递归部分调用了最近的方法PairestPairAux。
  • public static int cPA(Point [] X, Point [] Y).该方法执行算法的递归部分。也就是大部分的工作。

  • 其他方法和类

    一个点在平面中由Point类的对象表示。这很明显。它以数字形式保存x和y坐标,因此,如果P是Point类型的对象,则P.x和P.y

    输入点集由PointSet类的对象表示。因为这是
    一个集合不能有一个点的重复,我们不能假设元素有任何顺序。
  • public static PointSet gP(String f).
    这将打开一个名为f的文件并从中读取点。
  • public Point nP(PointSet P).
    这用于迭代P中的点。closestPair算法由
  • 方法实现
  • 公共(public)静态Point最近对(PointSet P)。
  • 如果n = 2,则返回(x1 − x2)^ 2 +(y1 − y2)^ 2
  • else
  • d←0
  • I的
  • ←1至n − 1做
  • 为j←i + 1至n做
  • t←(xi-xj)^ 2 +(yi-yj)^ 2
  • 如果t <>
  • d←t
  • 返回d
  • public static PointSet generatePoints(int n).
    这将返回一组n个点,它们的坐标是整数。
  • public Point[] sort(char c).
    这将返回数组中的点集中的点,该点按参数c指示的坐标以不降序排序。该参数采用值“x”或值“y”,否则将引发异常UnknownSortOptionException。

  • 这是我到目前为止写的:

    我决定第一个方法应该处理琐碎的情况,n = <>
      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;
    
    }
    

    是否已正确定义此方法?

    第二个:在这方面我需要大量时间帮助。
    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**
    
     }
    

    现在,当我定义以下类来测试我的方法时:
         public class Test{
    public static void main(String [ ] args)
     {
       ClosestPair.closestPairCheck( 10, 10);
    

    //生成t组大小为n的点,并获取所声明的最接近点的平方距离
    使用您对每个集合的mostestPair方法的实现进行配对。如果所有结果
    是正确的,则返回一条报告此消息的消息,否则报告失败。没有进一步的
    给出了信息。请注意,t必须严格为正(异常无效-
    否则引发NumberOfTestsException)。
    }
    }

    当给定可变距离值时,我在3个点的线程“main” java.lang.NullPointerException中得到以下异常(我在上面注意到)...我该怎么办?

    最佳答案

    好吧,让我们看看您的代码。首先,一个小提示:对于要发布在stackoverflow(和其他stackexchange网站)上的代码,最好使用缩进空间,因为制表符看起来很糟糕。

    因此,在这里再次正确地缩进了您的代码(通过Emacs和JDEE的方式进行了缩进-好像我没有正确配置它,或者它在弄清楚您的代码时遇到了一些问题),并且我的注释散布着。

    public static int closestPairAux(Point[] X, Point[] Y) 
    

    那么,问题又来了:这两个参数数组的含义是什么?它们都包含相同的点,还是包含其他点?你为什么要给两个数组?当您回答了这个问题后,给他们起更好的名字。

    除此之外,请为您的方法提供文档注释。它收到什么参数,返回什么? (如果我理解正确的话,它不会返回距离,而是返回距离的平方。)
        throws TrivialClosestPairException, UnknownSortOptionException
    {
        if (X.length<4){
            return PointSet.naiveClosestPair(new PointSet (X));
        }
    

    好的,这里小数组的递归结束了。
        int V = X[(int) Math.ceil(( (double) X.length/2)-1)].getX();
    

    如果我理解正确,那么您正在尝试获取数组的中间元素。这样会更清楚:
    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
        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,它们已经是。 (并再次查看Arrays.copyOfRange的文档-to索引是排他的。)

    因此,在这里,您将X数组拆分为两个(大约)相同大小的数组。
        int distance = Math.min(closestPairAux(PL,Y),closestPairAux(PR,Y));
    

    这是您的递归调用。实际上,您在这里做什么?为什么将这些参数提供给递归调用? (特别是为什么两个都接收相同的Y数组?)
        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中除法器附近的那些元素。
        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相同吗?
        return d;
    }
    

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

    关于java - 2个Java方法java.lang.NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5129365/

    有关java - 2个Java方法java.lang.NullPointerException的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

      总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

    3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    4. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

      我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

    5. Ruby 方法() 方法 - 2

      我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

    6. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

      我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

    7. ruby - Highline 询问方法不会使用同一行 - 2

      设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

    8. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

      我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

    9. ruby - 多个属性的 update_column 方法 - 2

      我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

    10. ruby - 检查方法参数的类型 - 2

      我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

    随机推荐