java - 我可以在 Java 中创建一个变量数组吗?

标签 java pointers

根据另一个设置,我有一个需要设置为数组元素的变量列表。在没有指针的情况下,我怎样才能使这个简洁?

示例:我有一个包含国际象棋走法和变量 startRow、startCol、endRow、endCol、color、piece(所有字符串)的字符串。

数据来自一个字符串,我将其拆分为 String[] 位。

但是如果关联类型是“A”那么字符串就是

startRow, startCol, endRow, endCol, color, piece

但是如果类型是“E”那么字符串是

piece, color, startRow, endRow, startCol, endCol

我有同名的变量。我能行

case "A":
    startRow = bits[0];
    startCol = bits[1];
    (etc)
case "E":
    startRow = bits[2];
    startCol = bits[4];
    (etc)

但我愿意

Vars[] av = {startRow, startCol, endRow, endCol, color, piece};
Vars[] ev = {piece, color, startRow, endRow, startCol, endCol};

并将 Vars[] allv 设置为其中之一并循环:

allv[i] = bits[i];

C(或 PHP)不是一个选项!

最佳答案

如果 startRowstartCol 等是字段(相对于局部变量),您可以为每个字段编写一个匿名函数,该函数具有分配它的参数到该字段的值。

例如

List<Consumer<String>> aSetters =
  Arrays.asList(
    s -> startRow = s,
    s -> startCol = s,
    s -> endRow = s,
    s -> endCol = s,
    s -> color = s,
    s -> piece = s);

List<Consumer<String>> eSetters =
  Arrays.asList(
    s -> piece = s,
    s -> color = s,
    s -> startRow = s,
    s -> startCol = s,
    s -> endRow = s,
    s -> endCol = s);

List<Consumer<String>> setters; // initialize to aSetters or eSetters accordingly

for (int i = 0; i < bits.length; i++) {
  setters.get(i).accept(bits[i]);
}

使用匿名函数 s -> color = s 的另一种方法是使用对该字段的 setter 的方法引用,如果可用的话(例如 this::setColor)。

如果 startRow 等是局部变量,则没有真正好的方法来执行此操作,因为 Java 不允许您从匿名函数分配给局部变量。有一些讨厌的 hack,比如用长度为 1 的数组替换每个变量,并从匿名函数分配给数组的第 0 个元素,这是允许的,但这在阅读时可能会非常困惑。

关于java - 我可以在 Java 中创建一个变量数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55936079/

相关文章:

java - 使用动态规划的餐厅最大利润

java - 从文件夹制作jar文件

自定义 BitString 类中的 Java 方法

pointers - 从 Go 中的数组返回指针数组

c++ - Object Mat(args); 之间的区别 - 内存分配明智 -和 Object *Mat = new Mat(args);在 C++ 中?

C - 如何使用指向结构的指针复制结构

pointers - 如何将一个 reflect.Type 转换为它的 ptr 类型?

java - 对字符串数组进行排序会出现 NullPointerException

java抛出异常而不捕获它?

C++:在结构定义问题中指向结构的指针