在Java方法中更改数组值而不将其传递给方法

时间:2016-03-31 16:37:00

标签: java arrays methods static class-members

我想创建一个函数来更改数组中的值,但我不想将数组传递给函数。以下是代码的一部分,private int[] data; public static void main(String[] args) { setPixel(3,2); //I'm not sure at this part? } public void setPixel(int i,int x){ data[i] = x; //Is there any possible way to change data[] } 在另一个函数中创建。

  # Save the model checkpoint periodically.
  if step % 10 == 0 or (step + 1) == FLAGS.max_steps:
    checkpoint_path = os.path.join(FLAGS.train_dir, 'model.ckpt')
    saver.save(sess, checkpoint_path, global_step=step)

    export_dir = FLAGS.export_dir
    print 'Exporting trained model to ' + FLAGS.export_dir
    export_saver = tf.train.Saver(sharded=True)
    model_exporter = exporter.Exporter(export_saver)
    #
    # TODO: where to find x and y?
    #
    signature = exporter.classification_signature(input_tensor=x, scores_tensor=y)
    model_exporter.init(sess.graph.as_graph_def(),
                        default_graph_signature=signature)
    model_exporter.export(export_dir, tf.constant(FLAGS.export_version), sess)

2 个答案:

答案 0 :(得分:2)

您应该围绕main方法创建一个类,并在main内实例化它。然后,您可以将data作为类的变量,然后可以在setPixel()方法中访问它。这是完成你所要求的正确的面向对象(OO)方式。

public class Data {
    private int[] data;

    public Data(int size) {
        data = new int[size];
    }

    public void setPixel(int i, int x) {
        data[i] = x;
    }

    public static void main(String[] args) {
        Data instance = new Data(5);
        instance.setPixel(3, 2);
    }
}

答案 1 :(得分:0)

这是我的回答,这与@zposten提供的内容非常相似,但也解决了OP data[] array created at another function的要求:

public class EncapsulatedArray
{
    private final int[] data;

    public EncapsulatedArray(final int[] data)
    {
        this.data = data;
    }

    public int getPixel(final int i)
    {
        return data[i];
    }

    public void setPixel(final int i, final int x)
    {
        data[i] = x;
    }

    @Override
    public String toString()
    {
        return Arrays.toString(data);
    }
}

为了验证和演示,我使用了:

public class EncapsulatedArrayDemo
{
    public static void main(final String[] args)
    {
        final int[] dataFromElsewhere = { 0, 1, 2, 3 };

        final EncapsulatedArray ex = new EncapsulatedArray(dataFromElsewhere);

        System.out.println(ex);

        ex.setPixel(2, 7 + ex.getPixel(2));

        System.out.println(ex);
    }
}

并获得以下控制台:

{ 0, 1, 2, 3 }
{ 0, 1, 9, 3 }

有很多原因可以解释为什么像这个(玩具)这样的包装类很有用,但是如果你希望保护"保护"来自外部的数据数组发生了变化(即只允许setPixel(int, int)修改data中的值)然后你需要更像@ zposten的回答,它永远不会让{{1}数组对象从包装器中转义。如果您确实需要使用数据阵列data,则需要使用类似我的解决方案 - 但是您必须采取其他措施来确保阵列不会在包装器后面摆弄#39回来了。