Java:访问多维数组中的行元素?
我正在做一个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,
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的一行程序