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

使用Java中的流初始化2D数组

姬振
2023-03-14

我有以下课程:

public class MyClass {
    //...
    public MyClass(int x, int y) {
        //...
    }
}

现在,我需要使用以下项目初始化2D数组:

int rows;
int cols;
//initializing rows and cols
MyClass[][] arr = new MyClass[rows][cols];
//how to initialize arr[x][y] with 
//new MyClass(x, y) with streams API

我看了这个例子,但它在我的情况下不起作用:Java8流和数组操作。它们使用单个IntStream

问:当然我可以使用嵌套for循环,但我认为它现在已经过时了,而且被认为是不好的。那么,如何应用streams api并以Java8的方式初始化它呢?

共有3个答案

史英睿
2023-03-14

您可以使用两个嵌套的IntStreams生成二维数组,如下所示:

public static void main(String[] args) {
    int rows = 2, cols = 3;
    // generate an array
    MyClass[][] arr = IntStream.range(0, rows)
            .mapToObj(x -> IntStream.range(0, cols)
                    .mapToObj(y -> new MyClass(x, y))
                    .toArray(MyClass[]::new))
            .toArray(MyClass[][]::new);
    // output
    Arrays.stream(arr).map(Arrays::toString).forEach(System.out::println);
    //[{x=0, y=0}, {x=0, y=1}, {x=0, y=2}]
    //[{x=1, y=0}, {x=1, y=1}, {x=1, y=2}]
}
java prettyprint-override">public static class MyClass {
    int x, y;

    public MyClass(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public String toString() {
        return "{x=" + x + ", y=" + y + "}";
    }
}
姬安志
2023-03-14

以下是一种方法

int rows = 5;
int cols = 10;
MyClass[][] arr = new MyClass[rows][cols];
Stream.generate(new Supplier<MyClass>() {
    int currentValue = 0;
    @Override
    public MyClass get() {
        MyClass myClass = new MyClass(currentValue / cols, currentValue % cols);
        currentValue++;
        return arr[myClass.x][myClass.y] = myClass;
    }
}).limit(rows * cols).forEach(System.out::println);

输出:

MyClass{x=0, y=0}
MyClass{x=0, y=1}
MyClass{x=0, y=2}
...
MyClass{x=4, y=9}
耿俊彦
2023-03-14

流不太擅长跟踪索引,这是您在这里需要的。所以你可以像@NicolasFilotto建议的那样滥用它们,或者用一种更简单的方式:

MyClass[][] array = new MyClass[rows][cols];
IntStream.range(0, rows)
        .forEach(r -> IntStream.range(0, cols)
                .forEach(c -> array[r][c] = new MyClass(r, c)));

您甚至可以让它看起来更具功能性,并去掉forEach和变异部分:

MyClass[][] array = IntStream.range(0, rows)
        .mapToObj(r -> IntStream.range(0, cols)
                .mapToObj(c -> new MyClass(r, c))
                .toArray(MyClass[]::new))
        .toArray(MyClass[][]::new);

但老实说,循环并不过时:

for (int r = 0; r < rows; r++) {
    for (int c = 0; c < cols; c++) {
        array[r][c] = new MyClass(r, c);
    }
}
 类似资料:
  • 问题内容: 我正在尝试初始化一个2D数组,其中每个元素的类型为 char 。到目前为止,我只能按照以下方式初始化此数组。 我认为如果数组是10 * 10,这是简单的方法。 有什么有效的方法吗? 问题答案: 这样的事情怎么样: 以下完整的Java程序: 输出: 之所以有效,是因为Unicode中的数字是连续的,从\ u0030开始(这是您从中得到的)。 表达式(您可以在其中变化以及介于两者之间(包括

  • 问题内容: 我在python中初始化2D数组时遇到问题。我想要一个6x6的阵列,我做到了 但是当我这样做时: 注意,我只设置了1个项目,并且在所有行上都设置了“ replicated”。怎么了?我认为它与引用相同的列表有关,但是我该如何解决呢? 我估计 可以,但是初始化一个空的6x6数组似乎很长,如果我想要10000x10000数组怎么办,效率会很低? 更新 我还可以初始化2D数组的字典吗?我有一

  • 第一行代码是什么意思?它如何调整数组大小?第二行代码如何初始化该字节数组(如果是)?

  • 问题内容: 我知道当我初始化一个char数组时: 要么 为什么不喜欢 初始化数组: 为什么它们不同?它是Java哲学的本质之一还是其​​背后的某些原因? 问题答案: 如果您曾经使用过 C ,那么答案就非常简单。在 C语言中 ,创建数组的方式是在堆栈上分配一个足以容纳元素数量的静态内存长度,并使用指针指向第一个元素-或堆上动态内存长度,然后用指针指向第一个元素。 在 C ++中 ,第二个版本已更改为

  • 问题内容: 我正在尝试制作2D切片游戏,当制作包含切片的阵列时,我得到了NullPointerException,这是一些代码。抱歉,如果格式不正确,请第一时间 公共类世界{ 然后在本课程中被称为(我相信这是问题的一部分) 公共类worldDraw { 问题答案: 创建对象数组时,将创建引用数组,但未分配引用。在尝试使用它们之前,必须先执行此操作。认为它类似于创建鸡蛋纸箱。在先将鸡蛋装满纸箱之前,

  • 我试图从WebClient中替换RestTemplate,因为根据Java文档,RestTemple将被弃用。Spring团队建议尽可能使用WebClient。 之前的RestTempalte代码如下 我想从WebClient替换RestTemplate。所以我实现了类WebClientConnection,如下所示 我使用这个依赖项 Webclient create 上有堆栈溢出错误 如何正确地