首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中,向量可以引用二维数组吗?

在Java中,向量可以引用二维数组吗?
EN

Stack Overflow用户
提问于 2012-11-14 12:59:05
回答 4查看 7.1K关注 0票数 0

基本上,我想创建一个在运行时大小不断增长的二维数组。我可以在Java中使用向量来做这件事吗?

那么这些是正确的吗?

int x= new x 100;

向量新向量x= ();

要将元素添加到数组中-

代码语言:javascript
复制
for i=0 to 99
   for j=0 to 99
   x.addElement(x[i] [j]);

本质上,它就像引用任何其他对象一样,只是在这里,我还必须指定索引号,对吗?

我是Java的新手。所以我将非常感谢任何帮助!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-14 20:04:16

不幸的是,Java既没有2D数组,也没有2D增长向量。

它具有数组的数组或向量的向量。

在您的示例中,您创建了Objects的一维向量:

代码语言:javascript
复制
Vector x= new Vector();

类似于Object[] x类型的增长数组

所以,当你这样做的时候

代码语言:javascript
复制
y.addElement(x[i][j]);

Java做了“装箱”,也就是说它做了

代码语言:javascript
复制
y.addElement(new Integer(x[i][j]));

由于您已将100x100元素添加到一维数组中,因此您需要自己计算位置

代码语言:javascript
复制
y.get(i*numcols+j)

因此,为了避免这一切,请使用向量的向量,如下例所示。此示例将新固定大小的数组复制到向量的向量中:

代码语言:javascript
复制
   // creates fixed size 2D array with zeros
    int [] [] x = new int [50][50]; 

    // creates empty vector of vectors of integers
    // y is of type Vector<Vector<Integer>>
    // y.get(row) is of type Vector<Integer>>
    // y.get(row).get(col) is of type Integer
    Vector<Vector<Integer>> y = new Vector<Vector<Integer>>(); 

    // set the size of vector of vectors (number of rows)
    // each row will be null for now
    y.setSize(x.length);

    // enumerating rows
    for(int row=0; row<x.length; ++row) {

        log.info("row {}", row);

        // assign empty vector for row
        y.set(row, new Vector<Integer>());

        // set row size (number of columns)
        y.get(row).setSize(x[row].length);

        // enumerating columns of current row
        for(int col=0; col<x[row].length; ++col) {

            // setting the value for a cell
            y.get(row).set(col, x[row][col]);

        }
    }
票数 1
EN

Stack Overflow用户

发布于 2012-11-14 13:18:32

如果不知道需要针对哪些情况进行优化,就很难知道该向您建议什么。

例如,这个简单的map包装器是为设置和获取特定索引而优化的sparse 2D matrix (根本不需要“增长”),但不适合迭代所有索引。

代码语言:javascript
复制
public class SparseMatrix<T> {
    private final Map<Coordinates, T> map = new HashMap<Coordinates, T>();
    private final T defaultValue;

    public SparseMatrix(T defaultValue) {
       this.defaultValue = defaultValue;
    }

    private static class Coordinates {
        private final int[] coordinates;

        Coordinates(int... coordinates) {
            this.coordinates = coordinates;
        }

        @Override
        public boolean equals(Object o) {
            return Arrays.equals(coordinates, ((Coordinates)o).coordinates);
        }

        @Override
        public int hashCode() {
            return Arrays.hashCode(coordinates);
        }
    }

    public T get(int x, int y) {
        T value = map.get(new Coordinates(x, y));
        if ( value == null ) {
            return defaultValue;
        }
    }

    public T set(int x, int y, T val) {
        return map.put(new Coordinates(x, y), val);
    }
} 

用法:

代码语言:javascript
复制
SparseMatrix<Integer> matrix = new SparseMatrix<Integer>(0);
matrix.set(3, 5, 7);
int seven = matrix.get(3, 5);
int zero = matrix.get(3, 6); //not set yet, uses default    

它也可以很容易地适应N维。当然,在生产代码中,您不会使用自己的库,而是使用一个做得更好的库。

票数 1
EN

Stack Overflow用户

发布于 2012-11-14 13:01:27

在java中是这样的:

代码语言:javascript
复制
int [][] x = new int [100] [100]

ArrayList <Integer> y = new ArrayList();

y.add(some number);

有关Arraylist的更多信息

Java允许您拥有由不同数据类型组成集合。例如

代码语言:javascript
复制
ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);

因此,您还可以使用ArrayList的ArrayList等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13373289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档