我在将简单的C ++代码行转换为Java时遇到麻烦。我想声明一个具有给定尺寸的2D矢量。在C ++中,我只使用以下代码行:
std::vector<std::vector<MyObject>> treeVector(xSize, std::vector<MyObject>(ySize));
非常容易。这样做,使用类的默认构造函数在每个单元格内部创建一个空对象来创建我的Vector。这使得使用它变得容易。
我现在正在搜索和搜索stackoverflow一个小时,但是我无法提出任何建议。我能做的最好的就是创建一个完全空的2D矢量。 Java是否无法像C ++一样做到?我是否需要将向量创建为空并进行嵌套的for循环以使其达到所需的大小?
答案 0 :(得分:0)
如果您想要{{1}中的List
中的Lists
,则可以使用Java流来做到这一点:
MyObject
内部public class MyObject {
@Override
public String toString() {
return "MyObject";
}
}
import static java.util.stream.Collectors.toList;
import java.util.List;
import java.util.stream.Stream;
public class TwoD {
public static void main(String[] args) {
int xSize = 7;
int ySize = 11;
List<List<MyObject>> treeVector = Stream.generate(
() -> Stream.generate(MyObject::new).limit(ySize).collect(toList()))
.limit(xSize).collect(toList());
System.out.println(treeVector);
}
}
创建一个新Stream.generate
的列表(可能是无限的),将其限制为MyObjects
的大小,并将其收集到Java ySize
中。外部的List
与之类似,但是它不是创建Stream.generate
的{{1}}的列表,而是创建这些列表的列表(特别是其中的List
)。
我应该补充一点,MyObjects
语法是将用于生成每个列表的lambda,而xSize
是对() -> ...
ctor的方法引用,即用于创建MyObject::new
而不是lambda。
(注意:“像lambda一样”严格来说在技术上并不准确,但这只是为了快速向来自C ++背景的人解释。)