当前位置: 首页 > 知识库问答 >
问题:

在Java中,有没有方法以类型安全的方式声明List的二维数组?[副本]

彭梓
2023-03-14

下面是我所拥有的代码,在我调整数组大小并实例化数组时,它可以正常工作,但带有类型安全警告:

import java.util.ArrayList;
import java.util.List;

public class Test {

    private static final int MAX_ROWS = 2;
    private static final int MAX_COLS = 5;
    
    private List<String> _stringSets[][];
    
    public Test() {
        _stringSets = new List[MAX_ROWS][MAX_COLS];
        
        for(int row = 0; row < MAX_ROWS; row++) {
            for(int col = 0; col < MAX_COLS; col++) {
                _stringSets[row][col] = new ArrayList<String>();
            }
        }
    }
}

我试过了

_stringSets = new List<String>[MAX_ROWS][MAX_COLS];

但这行不通...

共有2个答案

缑勇锐
2023-03-14

通常不建议以这种方式混合使用数组和列表。可能会考虑使用其他数据结构来实现类似的效果。例如,可以创建使用位置坐标实现类似结果的贴图。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class MapList {

  private static Map<Position, List<Integer>> mapList;
  
  public static void main(String[] args) {
    final int MAX_X = 5;
    final int MAX_Y = 6;
    
    mapList = new HashMap<>();
    
    for(int i = 0; i < MAX_X; i++) {
      for(int j = 0; j < MAX_Y; j++) {
        mapList.put(new Position(i, j), new ArrayList<>());
        for(int k = 0; k < 5; k++) {
          mapList.get(new Position(i, j)).add(k);
        }
      }
    }
    
    for(Position p : mapList.keySet())
      System.out.println(p.toString() + mapList.get(p));
  }
  
  private static class Position {
    private Integer x;
    private Integer y;
    
    public Position(Integer x, Integer y) {
      this.x = x;
      this.y = y;
    }
    
    @Override
    public boolean equals(Object o) {
      if(this == o)
        return true;
      if(o == null)
        return false;
      if(getClass() != o.getClass())
        return false;
      Position other = (Position) o;
      return x == other.x && y == other.y;
    }
    
    @Override
    public int hashCode() {
      return Objects.hash(x, y);
    }
    
    
    @Override
    public String toString() {
      return "(x:" + x + ", y:" + y + ")";
    }
  }
}
戚宏扬
2023-03-14

列表是一维的,可以这样声明:

列表

当你似乎在寻找一个二维数组时,它的声明如下:

String[][] myArray = 新字符串[n1][n2]

所以你想要的可能是这样的:

public class Test {

    private static final int MAX_ROWS = 2;
    private static final int MAX_COLS = 5;

    private String[][] stringSets;

    public Test() {
        stringSets = new String[MAX_ROWS][MAX_COLS];

        for(int row = 0; row < MAX_ROWS; row++) {
            for(int col = 0; col < MAX_COLS; col++) {
                stringSets[row][col] = row+"-"+col;
            }
        }
    }
}

 类似资料:
  • 问题内容: 假设我有一个方法m(),该方法将字符串数组作为参数。有什么方法可以在我打电话时直接声明该数组?即代替: 我可以只用一行代替它,而避免声明一个我永远不会使用的命名变量吗? 问题答案:

  • 我想声明一个像belove这样的类 但是它似乎没有语法来支持这一点,它有任何方法可以保持在

  • 我正在尝试读取图像的像素,并将它们填充到二维数组中;但是,我不知道如何声明一个全局数组?有什么需要帮忙的吗?

  • 问题内容: 在C#中,我实际上可以这样做: 但是由于某种原因,我无法使其在Java中工作。 我要做的是在超类上创建一个静态方法,以便可以将子类转换为XML。 问题答案: 称为: 或更明确地: 更令人困惑的是,您可以拥有既构造泛型类型又具有泛型参数的构造函数。不记得该语法,也从未在愤怒中使用过它(无论如何,最好还是使用静态创建方法)。 强制转换是不安全的,并且您不能编写T.class。因此,将T.c

  • 我想做的是,我正在制作一个具有相同uid的所有文档的未来列表,然后使用FutureBuilder制作一个ListView。 给我错误的部分是, 这里是错误, 非常感谢。

  • 我正在努力用testNG在类级别声明一个参数。我有一个参数,在方法级别声明时可以正常工作。 因为我正在将测试映射到cucumber步骤定义,并将在方法级别声明一个参数,所以我想将browser参数从方法级别转移到类(全局)级别。因此,在xml文件中,我将浏览器参数从测试级别移动到套件级别,如下所示: 然后在测试类中,我从方法和类中删除了参数,并将声明为。不幸的是,浏览器在运行时找不到,导致一个: