【问题标题】:Can't initialize a Two-Dimentional Array in Java无法在 Java 中初始化二维数组
【发布时间】:2014-07-30 16:48:46
【问题描述】:

我试图将鼠标的 X 轴位置和鼠标的 Y 轴位置分别存储在一个二维数组中,稍后使用它,但出现错误。 我是数组的新手,我正在尝试使用 for 循环和实例变量/全局变量初始化一个二维数组。我得到的错误说“数组常量只能在初始化程序中使用”。我浏览了文档并更改了代码,但没有得到解决方案。

我阅读以获得解决方案的问题和文档

我的代码:

package com.selenium;

import java.awt.*;

public class MouseAxis {
  int[][] mouseLocation ;
  int AxisX;
  int AxisY;

public void getAxisXAndY(int x, int y){
    AxisX=x;
    AxisY=y;
} // getAxisXAndY

public void mouseAxisPosition() throws AWTException{
    int x , y;
    PointerInfo pointer = MouseInfo.getPointerInfo();
    Point point = pointer.getLocation();
    x=(int)point.getX();
    y=(int)point.getY();
    getAxisXAndY(x,y);
} // mouseAxisPosition

public void storeMouseLocation(){
 for(int i=0; i<=20; i++){
      for(int j=i; j<=1; j++){
        int[][] temp = new int[j][i];
        temp[j][i]={AxisX,AxisY} ;
        mouseLocation[j][i]=temp[j][i];
        Thread.sleep(4000);
        mouseAxisPosition();
      } // for_2
  } // for_1
 } // storeMouseLocation
} // MouseAxis

【问题讨论】:

  • 好吧,你永远不会给mouseLocation赋值,所以它的默认值是null...这也不适用于维数组...

标签: java arrays for-loop multidimensional-array


【解决方案1】:

问题是您正在尝试将数据存储在索引中。如果你想要一个位置数组,那么你有几个选择:

有 2 个数组

int lastLocation = 0;
int[] x = new int[10];
int[] y = new int[10];

PointerInfo pointer = MouseInfo.getPointerInfo();
Point point = pointer.getLocation();
x[lastLocation] = (int)point.getX();
y[lastLocation] = (int)point.getY();
lastLocation++;

给定索引 i,您可以从数组中获取 x 和 y 值。

创建一个特殊类型的数组

只需存储整个Point 对象:

int lastLocation = 0;
Point[] points = new Point[10];
PointerInfo pointer = MouseInfo.getPointerInfo();
Point point = pointer.getLocation();
points[lastLocation] = point;
lastLocaiton++;

【讨论】:

    【解决方案2】:

    在 Java 中,int[][] 表示整数数组的引用数组。虽然有些语言有 NxM 整数数组的概念,但 Java 没有;最接近的可能是一个包含 N 个引用的数组,这些引用独立地识别不同的 M 项整数数组。

    如果想要让MouseLocation 看起来可以识别 NxM 整数数组,则必须首先对其进行初始化以识别对整数数组的 N 引用数组,然后初始化其中的每个元素 array 来标识不同的 M 个整数数组。例如,要将其初始化为 5x7,可以执行以下操作:

    mouseLocation = new int[5][];
    for (int i=0; i<5; i++)
      mouseLocation[i] = new int[7];
    

    请注意,Java 没有强制要求所有内部数组都是不同的,但如果不是,事情就会表现得很奇怪。例如,如果有人说:

    mouseLocation[2] = mouseLocation[3];
    

    最初可能看起来是将所有内容从第 3 行复制到第 2 行,但它也会产生另一种影响:对mouseLocation[2] 标识的数组的任何操作也将对mouseLocation[3] 标识的数组进行操作,因为它们将是相同的数组

    数组的数组在 Java 中可能很棘手;在某些情况下,使用 N*M 元素的单个数组来表示 NxM 网格可能更简单。访问代码可能不太直观(访问 [i,j] 处的元素将被写为theArray[i*M+j]),但数组将表现为单个对象,而不是作为对对象的一组引用,这些对象应该都是不同的.

    【讨论】:

    • -1 因为 Java 提供了一种用于设置二维数组 new int[5][7] 的语法,这与您必须自己编写循环的暗示相反。 +1 获取其他有用信息。
    • @ajb:我以为我试过一次,但没用;它总是提供那个功能吗?我当然可以编辑帖子以更正该细节。在任何情况下,即使 Java 提供了与循环等效的语法,但仍然需要注意的是,它不会创建一个 5x7 数组,而是创建一个包含五个对七元素数组的引用的数组。我没记错吗,在这样的数组上调用像 clone 这样的方法通常是没有用的,因为新数组将识别与原始数组相同的五个七元素数组?
    • 是的,我认为 Java 一直都有这个。 Arrays.copyOf() 可用于复制一维数组,但如果元素是引用,它们将是相同的引用。我在 JRE 或 Apache Commons 中都没有看到多维数组的“深拷贝”,但有人说他们有一个 here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2013-11-21
    • 2012-11-29
    相关资源
    最近更新 更多