java - 从字符串初始化java int 2d数组
问题描述
我有一个简单的二维数组
// Creating and Initializing 2D array
int a[][] = {{0,1},{2,3},{4,5}};
for(int i=0; i<3; i++) {
for(int j=0; j<2; j++) {
System.out.print(a[i][j]+" ");
}
System.out.println();
}
一切正常。但是当内容是动态的并且来自变量时,如何初始化数组?
String arrContent = "{{0,1},{2,3},{4,5}}"; //actually a method readContentFromFile(); will deliver the content
int a[][] = arrContent;
有没有办法做到这一点?
解决方案
可以使用String::split
Stream API 解析输入流:
- 获取在一对之间用逗号分隔的行
},{
- 使用删除多余的大括号
String::replaceAll
- 对于每一行,用逗号分隔,将数字转换为 int
Stream::mapToInt
并获取数组 - 收集到多维数组
Stream::toArray
String arrContent = "{{0,1},{2,3},{4,5}}";
int[][] arr = Arrays.stream(arrContent.split("\\}\\s*,\\s*\\{")) //1
.map(s -> s.replaceAll("[{}]", "")) //2
.map(s -> Arrays.stream(s.split("\\s*,\\s*")) //3
.mapToInt(Integer::parseInt).toArray()
)
.toArray(int[][]::new); //4
System.out.println(Arrays.deepToString(arr));
输出
[[0, 1], [2, 3], [4, 5]]
另一种方法是使用 JSON 解析器,但是,需要修改初始输入字符串以成为有效的 JSON 数组(大括号必须使用更简单{}
的方括号替换):[]
String::replace(char old, char rep)
String arrContent = "{{0,1},{2,3},{4,5}}";
ObjectMapper om = new ObjectMapper();
int[][] arr = om.readValue(
arrContent.replace('{', '[')
.replace('}', ']'),
int[][].class);
System.out.println(Arrays.deepToString(arr));
// output
[[0, 1], [2, 3], [4, 5]]
推荐阅读
- flutter - Flutter,如何将容器视为面板或类似的东西?
- python - rect.collisionrect 在两个矩形之间不起作用
- android - 对象属性中的图像如何工作并从位图中设置它们?
- postgresql - Jooq 无法从数据库中找到我的公共模式
- c - 将类型转换的指针传递给 pthread_join
- mongodb - 如何获取日期的年份并计算每年的记录
- javascript - 包含小表的对象与不包含表的较大对象
- sql-server - 无法在 AWS RDS 的 SQL Server 上执行系统过程
- python - 在python上导入模块的问题
- c# - Web API:控制器中几乎相同操作的巨大 TTFB 时间差