首页 > 解决方案 > 我可以在 Java 中创建一个变量数组吗?

问题描述

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

示例:我有一个包含国际象棋移动和变量 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 设置为 1 并循环:

allv[i] = bits[i];

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

标签: javapointers

解决方案


如果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一种方法是使用对该字段的设置器的方法引用,如果有可用的(例如this::setColor)。

如果startRow, etc. 是局部变量,则没有真正的好方法可以做到这一点,因为 Java 不允许您从匿名函数分配给局部变量。有一些讨厌的 hack,比如用长度为 1 的数组替换每个变量,并从匿名函数中分配给数组的第 0 个元素,这是允许的,但这可能会让人很困惑。


推荐阅读