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

时间:2016-01-30 16:43:47

标签: java multidimensional-array sum elements

我正在做一个Java项目并构建了一个像这样的Polygon:

DPolygons[NumberOf3DPolygons] = new DPolygon(new double[]{0, 2, 2, 0}, new double[]{0, 0, 0, 0},  new double[]{0, 0, 3, 3}, Color.red);

而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元素的正确语法是什么? (或者我怎么能得到这笔钱?)

5 个答案:

答案 0 :(得分:0)

  for(int i=0; i<DPolygons.length; i++){
        //If you have some condition, you can put over here.
        if(condition) {
        sum = DPolygons[i].z + sum; 
        }

    }

答案 1 :(得分:0)

全局变量z是否公开?

public double z;

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

课堂内:

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

答案 2 :(得分:0)

设计这样的课程......

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;
    }
}

对于特定的多边形......

double sum2 = 0;
//Change index number to whatever specific polygon you want to sum.
int specificPolygon=0;
// Then to sum.
for(double zValue : dPolygons.get(specificPolygon).getZ())
{
    sum2 += 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;
}

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

答案 3 :(得分:0)

  

我想要做的是计算其z坐标的总和(在这种情况下将是= 6)

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

viewController.delegate

例如,如果您有一个3D多边形数组:

class DPolygon
{
    private double[] z;
    //Your other attributes here..
    //Your constructors here..

    public double getSumOfZ(){
        double sum = 0.0;
        if(z != null && z.length > 0)
            for(int i=0; i<z.length; i++)
                sum += z[i];
        return sum; 
    }
}

要从特定的3D多边形访问z的总和:

//Outside the class (for e.g. from the main method):
DPolygon poly1 = new DPolygon(new double[]{0, 2, 2, 0}, new double[]{0, 0, 0, 0},  new double[]{0, 0, 3, 3}, Color.red)};
DPolygon poly2 = new DPolygon(new double[]{0, 2, 2, 0}, new double[]{0, 0, 0, 0},  new double[]{0, 0, 3, 3}, Color.red)};
DPolygon poly3 = new DPolygon(new double[]{0, 2, 2, 0}, new double[]{0, 0, 0, 0},  new double[]{0, 0, 3, 3}, Color.red)};

DPolygons[NumberOf3DPolygons] polygons3D = {poly1, poly2, poly3};
  

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

在您的案例中polygons3D[0].getSumOfZ(); //Get sum of z from first polygon 有两种可能性:

  1. 您没有在DPolygon类中初始化z数组。
  2. 您在数组中使用的DPolygon元素为null。
  3. 确保从DPolygon类初始化NullPointerException

    z array

答案 4 :(得分:0)

关于这个主题还有两个更简洁的概念:Collections和Java 1.8中的新内容,ReductionStreams

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

这是使用Collections演示相关代码的工作再现,以及另一个好东西:用于计算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() );
    }
}

当您尝试为特定索引使用至少两个xyz时,仍有可能获得IndexOutOfBoundsException:我们不确定每个点有3个坐标,因为有些数组可能小于另一个数组。为了确保所有点都有3个坐标,你可以将它们分组:

       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 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();
        }
    }

你可以更进一步,将这一点抽象为

    public static class Point3D
    {
        double x, y, z;

        public Point3D( double x, double y, double z )
        {
            this.x = x;
            this.y = y;
            this.z = z;
        }
    }
通过将double[]更改为Point3D,将new double[]{ ... }更改为new Point3D( ... ),将( p ) -> p[2]更改为( p ) -> p.z,可以轻松支持

还有一件事:Java Code Conventions建议标识符只有在大写字母,接口,枚举等时才以大写字母开头 - 它们不应该用于参数,局部变量或字段。几乎每个人都会认为Screen.NumberOf....是类Screen中的静态字段(通过将其视为整数而将其视为嵌套类)。 我的想法是,如果我输入com.Foo.Bar.baz.hmm,每个人都知道com是包名,Foo是一个类,Bar是嵌套类Foo$Bar,{ {1}}是类baz中的静态字段,Bar是对象hmm的字段。