Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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:访问多维数组中的行元素?_Java_Multidimensional Array_Sum_Elements - Fatal编程技术网

Java:访问多维数组中的行元素?

Java:访问多维数组中的行元素?,java,multidimensional-array,sum,elements,Java,Multidimensional Array,Sum,Elements,我正在做一个Java项目,并构建了如下多边形: DPolygons[NumberOf3DPolygons] = new DPolygon(new double[]{0, 2, 2, 0}, new double[]{0, 0, 0, 0}, new double[]{0, 0, 3, 3}, Color.red); screen.polygons.add( new Polygon( Color.RED,

我正在做一个Java项目,并构建了如下多边形:

DPolygons[NumberOf3DPolygons] = new DPolygon(new double[]{0, 2, 2, 0}, new double[]{0, 0, 0, 0},  new double[]{0, 0, 3, 3}, Color.red);
       screen.polygons.add(
            new Polygon(
                Color.RED,
                new double[] { 0, 0, 0 },
                new double[] { 2, 0, 0 },
                new double[] { 2, 0, 3 },
                new double[] { 0, 0, 3 } ) );
而类DPolygon具有以下构造函数:

public DPolygon(double[] x, double[] y, double[] z, Color c)
{
    Screen.NumberOf3DPolygons++;
    this.x = x;
    this.y = y;
    this.z = z;
    this.c = c;
    createPolygon();
}
我想做的是计算它的z坐标之和(在本例中为=6) 以下是我的想法:

sum = DPolygons[NumberOf3DPolygons].z[0]+DPolygons[NumberOf3DPolygons].z[1]+
                    DPolygons[NumberOf3DPolygons].z[2]+DPolygons[NumberOf3DPolygons].z[3];
但是它给出了一个
NullPointerException
,因为它不识别
DPolygons[NumberOf3DPolygons].z[0]
作为多边形的第一个z值,依此类推


有人能告诉我访问这些z元素的正确语法是什么吗?(或者我怎样才能得到这个总和?)for(inti=0;I
for(inti=0;I是全局变量z declare public吗

public double z;
但是,我建议在Dpolygon类中创建一个公共方法来检索全局z值,并使用该getter而不是直接调用属性

课堂内:

public Double [ ] getZ (){return new Double (z[1],z [2],z [3]);}

全局变量z declare是公共的吗

public double z;
但是,我建议在Dpolygon类中创建一个公共方法来检索全局z值,并使用该getter而不是直接调用属性

课堂内:

public Double [ ] getZ (){return new Double (z[1],z [2],z [3]);}

设计这样的类

public class DPolygon
{
    private double[] x, y, z;
    private Color color;

    public DPolygon(double[] x, double[] y, double[] z, Color color)
    {
        // Number of polygons best found in containing class.
        this.x = x;
        this.y = y;
        this.z = z;
        this.color = Color;
    }

    public double[] getZ()
    {
        return z;
    }

    //...Other getters and setters.
}
使用带有嵌套foreach循环的ArrayList获取所有多边形的所有z值

ArrayList<DPolygon> dPolygons = new ArrayList<DPolygon>();

dPolygons.add(new DPolygon(new double[]{0, 2, 2, 3}, new double[]{0, 0, 0, 0},  new double[]{0, 0, 3, 3},Color.Red));

double sum=0;
for(DPolygon polygon : dPolygons)
{
    for (double zValue : polygon.getZ())
    {
        sum += zValue;
    }
}
但是如果你嫁给了一个数组

DPolygons[] dPolygons = new DPolygons[numberOfPolygons];

dPolygons[0] = new DPolygon(new double[]{0, 2, 2, 3}, new double[]{0, 0, 0, 0},  new double[]{0, 0, 3, 3},Color.Red)
//...Adding other polygons

// For single polygon
double sum3 = 0;
// As before, set specificPolygon equal to the index of the polygon you want.
int specificPolygon = 0;
for(double zValue : dPolygons[specificPolygon].getZ())
{
    sum3 += zValue;
}

最后一种方法的问题是,当数组初始化时,您需要知道屏幕上的多边形数量。您不能在运行时动态添加更多多边形。

将类设计为这样

public class DPolygon
{
    private double[] x, y, z;
    private Color color;

    public DPolygon(double[] x, double[] y, double[] z, Color color)
    {
        // Number of polygons best found in containing class.
        this.x = x;
        this.y = y;
        this.z = z;
        this.color = Color;
    }

    public double[] getZ()
    {
        return z;
    }

    //...Other getters and setters.
}
使用带有嵌套foreach循环的ArrayList获取所有多边形的所有z值

ArrayList<DPolygon> dPolygons = new ArrayList<DPolygon>();

dPolygons.add(new DPolygon(new double[]{0, 2, 2, 3}, new double[]{0, 0, 0, 0},  new double[]{0, 0, 3, 3},Color.Red));

double sum=0;
for(DPolygon polygon : dPolygons)
{
    for (double zValue : polygon.getZ())
    {
        sum += zValue;
    }
}
但是如果你嫁给了一个数组

DPolygons[] dPolygons = new DPolygons[numberOfPolygons];

dPolygons[0] = new DPolygon(new double[]{0, 2, 2, 3}, new double[]{0, 0, 0, 0},  new double[]{0, 0, 3, 3},Color.Red)
//...Adding other polygons

// For single polygon
double sum3 = 0;
// As before, set specificPolygon equal to the index of the polygon you want.
int specificPolygon = 0;
for(double zValue : dPolygons[specificPolygon].getZ())
{
    sum3 += zValue;
}
最后一种方法的问题是,当数组初始化时,您需要知道屏幕上的多边形数量。您无法在运行时动态添加更多多边形

我想做的是计算它的z坐标之和(在本例中为=6)

如果我是你,我会为z的和(甚至是x和y的和)创建一个方法:

要访问特定三维多边形的z总和,请执行以下操作:

polygons3D[0].getSumOfZ();   //Get sum of z from first polygon

但它给出了一个NullPointerException,因为它不识别DPolygons[NumberOf3DPolygons].z[0]作为多边形的第一个z值,依此类推

在您的情况下,
NullPointerException
有两种可能发生:

  • 您没有在DPolygon类中初始化z的数组
  • 从数组中使用的DPolygon元素为null
  • 确保从DPolygon类初始化
    z数组

    class DPolygon
    {
        //Your other attributes here..
        private double[] x,y,z;
        public DPolygon(){
            initCoordinates();    //Init all arrays in the constructor 
        }
    
        //Initialize all x,y,z arrays.
        private void initCoordinates(){
            x = new double[]{0.0, 0.0, 0.0, 0.0};
            y = new double[]{0.0, 0.0, 0.0, 0.0};
            z = new double[]{0.0, 0.0, 0.0, 0.0};
        }
    }
    
    我想做的是计算它的z坐标之和(在本例中为=6)

    如果我是你,我会为z的和(甚至是x和y的和)创建一个方法:

    要访问特定三维多边形的z总和,请执行以下操作:

    polygons3D[0].getSumOfZ();   //Get sum of z from first polygon
    

    但它给出了一个NullPointerException,因为它不识别DPolygons[NumberOf3DPolygons].z[0]作为多边形的第一个z值,依此类推

    在您的情况下,
    NullPointerException
    有两种可能发生:

  • 您没有在DPolygon类中初始化z的数组
  • 从数组中使用的DPolygon元素为null
  • 确保从DPolygon类初始化
    z数组

    class DPolygon
    {
        //Your other attributes here..
        private double[] x,y,z;
        public DPolygon(){
            initCoordinates();    //Init all arrays in the constructor 
        }
    
        //Initialize all x,y,z arrays.
        private void initCoordinates(){
            x = new double[]{0.0, 0.0, 0.0, 0.0};
            y = new double[]{0.0, 0.0, 0.0, 0.0};
            z = new double[]{0.0, 0.0, 0.0, 0.0};
        }
    }
    

    关于这个主题,还有两个更简洁的概念需要介绍:和,在Java1.8中是新的,of

    使用将消除试图使用全局变量管理动态数组而导致的NullPointerException。 在您的情况下,递增
    屏幕。在
    DPolygon
    的构造函数中,NumberOf3DPolygons
    不是它的正确位置。如果您构造另一个
    DPolygon
    而不将其添加到该数组中,会发生什么?您可能希望使用
    add
    使该变量与添加到列表中的元素数量一致>方法在管理数组的对象中。幸运的是,这已经在Java集合类中为我们完成了

    下面是使用集合演示的相关代码的工作副本,还有另一个好处:一个用于计算z坐标和的一行程序。

    import java.awt.Color;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class Main1
    {
        public static class Screen
        {
            List<DPolygon> polygons = new ArrayList<>();
        }
    
        public static class DPolygon
        {
            private double[] x, y, z;
    
            private Color c;
    
            public DPolygon( double[] x, double[] y, double[] z, Color c )
            {
                this.x = x;
                this.y = y;
                this.z = z;
                this.c = c;
            }
    
            public double sumZ()
            {
                return Arrays.stream( z ).sum();
            }
    
        }
    
        public static void main( String[] args )
        {
            Screen screen = new Screen();
    
            screen.polygons.add(
                new DPolygon(
                    new double[] { 0, 2, 2, 0 },
                    new double[] { 0, 0, 0, 0 },
                    new double[] { 0, 0, 3, 3 },
                    Color.red ) );
    
            System.out.println( screen.polygons.get( 0 ).sumZ() );
        }
    }
    
    使用此
    DPolygon
    类:

        public static class DPolygon
        {
            List<double[]> points = new ArrayList<>();
    
            Color color;
    
            public DPolygon( Color c, double[]... coords )
            {
                this.points = Arrays.asList( coords );
                this.color = c;
            }
    
            public double sumZ()
            {
                return points.stream().mapToDouble( ( p ) -> p[2] ).sum();
            }
        }
    
    通过将
    double[]
    更改为
    Point3D
    ,将
    newdouble[]{…}
    更改为
    newpoint3d(…)
    ,将
    (p)->p[2]
    更改为
    (p)->p.z
    ,可以很容易地支持这一点

    还有一件事:建议标识符仅当它们是类、接口、枚举等时才以大写字母开头-它们不应用于参数、局部变量或字段。几乎每个人都会认为
    Screen.numberoff….
    是类
    Screen
    中的静态字段(通过将其视为整数而将其视为嵌套类后)。
    这个想法是,如果我键入
    com.Foo.Bar.baz.hmm
    每个人都知道
    com
    是一个包名,
    Foo
    是一个类,
    Bar
    是嵌套类
    Foo$Bar
    baz
    是类
    Bar
    中的一个静态字段,
    hmm
    是对象
    baz
    /p>有两个字段e在本主题中介绍的简洁概念:以及,在Java1.8中新增的

    使用将消除试图使用全局变量管理动态数组而导致的NullPointerException。 在您的情况下,递增
    屏幕。在
    DPolygon
    的构造函数中,NumberOf3DPolygons
    不是它的正确位置。如果您构造另一个
    DPolygon
    而不将其添加到该数组中,会发生什么?您可能希望使用
    add
    使该变量与添加到列表中的元素数量一致>方法在管理数组的对象中。幸运的是,这已经在Java集合类中为我们完成了

    这里有一个相关代码的工作副本,演示如何使用集合,还有另一个好处:一个用于计算su的一行程序