使用变量作为参数

时间:2017-03-21 22:53:02

标签: java

我有一个班级

public class Coordinates {
   public int x,y,z;

   public Coordinates (x, y, z) {
      this.x = x;
      this.y = y;
      this.z = z;
   }
}

在另一个班级'方法我想访问坐标,但我必须为每个坐标xyz执行相同的长代码。有没有办法为参数使用变量,如:

Coordinates coords0 = new Coordinates(1, 2, 3);
Coordinates coords1 = new Coordinates(4, 1, 3);
Coordinates coords2 = new Coordinates(5, 1, 3);
Coordinates coords3 = new Coordinates(1, 1, 3);
Coordinates coords4 = new Coordinates(1, 2, 0);
Set<Coordinates> set = new HashSet<Coordinates>();
set.add(coords0);
set.add(coords1);
set.add(coords2);
set.add(coords3);
set.add(coords4);
int sum = 0;
for (int i = 0; i < 3; i++) {
    String param = "";
    if(i == 0) param = "x";
    if(i == 1) param = "y";
    if(i == 2) param = "z";
    Iterator<Coordinates> it = set.iterator();
    while(it.hasNext()) {
       Coordinates currentCoords = it.next();
       sum += currentCoords.param;
    }
} 

这显然不起作用,但有没有办法实现与此类似的东西?

4 个答案:

答案 0 :(得分:1)

据我所知,问题是您必须将相同的代码应用于坐标的集合,并且必须对所有x坐标执行相同的代码,然后对所有坐标执行坐标的y,然后是坐标的所有z。

所以你可能需要一个看起来像这样的方法:

private void complexCode(Collection<Coordinates> collection, ToIntFunction<Coordinates> axisAccessor) {
   // ...
   for (Coordinates c : collection) {
       int axis = axisAccessor.applyAsInt(c);
       //...
   }
   // ...
}

然后,您将使用

调用您的函数三次
complexCode(collection, coordinates -> coordinates.x);
complexCode(collection, coordinates -> coordinates.y);
complexCode(collection, coordinates -> coordinates.z);

答案 1 :(得分:0)

您当前的尝试非常接近,只有您不需要param变量println(并根据评论消除i值)。像,

Coordinates coords = new Coordinates(1, 2, 3);
System.out.println("Coordinate x is " + coords.x);
System.out.println("Coordinate y is " + coords.y);
System.out.println("Coordinate z is " + coords.z);

格式稍有不同,并覆盖toString()中的Coordinates。哦,并修复构造函数。

public class Coordinates {
    public int x, y, z;

    public Coordinates(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    @Override
    public String toString() {
        return String.format("x=%d, y=%d, z=%d", x, y, z);
    }
}

然后你可以print喜欢

Coordinates coords = new Coordinates(1, 2, 3);
System.out.println("Coordinate " + coords);

答案 2 :(得分:-1)

你想要的是一个getter方法。创建setter方法也是个好主意。他们看起来像x的样子。您需要为y和z制作类似的方法。

public int getX(){
    return x;
}

public void setX(int newX){
    x = newX;
}

您可以在Coordinates类中创建这些,然后从您可以执行的其他课程中创建

if(i == 0) param = coords.getX();

答案 3 :(得分:-1)

你可以使用这样的反射:

int paramInt = Coordinates.class.getField(param).getInt(coords);
System.out.println("Coordinate "+param+" is "+paramInt);

唐&#39;吨