根据另一个设置,我有一个需要设置为数组元素的变量列表。在没有指针的情况下,我怎样才能使这个简洁?
示例:我有一个包含国际象棋走法和变量 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)不是一个选项!
最佳答案
如果 startRow
、startCol
等是字段(相对于局部变量),您可以为每个字段编写一个匿名函数,该函数具有分配它的参数到该字段的值。
例如
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/