基于另一个设置,我有一个需要设置为数组元素的变量列表。没有指针,我该如何简洁?
示例:我有一个带有国际象棋动作的字符串,并且变量startRow,startCol,endRow,endCol,颜色,块(所有字符串)。
数据来自一个字符串,我将其拆分为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)不是选项!
答案 0 :(得分:1)
如果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不允许您从匿名函数中分配局部变量。有一些讨厌的技巧,例如,将每个变量替换为长度为1的数组,并从匿名函数中将其分配给数组的第0个元素,这是允许的,但这会使阅读变得非常混乱。
答案 1 :(得分:0)
我建议作为解决方案,而不检查错误和值范围 (这只是架构/想法):
public static void main(String[] args) {
int[] mask_A = {1,2,3,4,0};
int[] mask_B = {2,3,0,4,1};
String[] source = {"A", "B", "C", "D", "E"};
System.out.println(Arrays.asList(setMask(source,mask_A)));
System.out.println(Arrays.asList(setMask(source,mask_B)));
}
public static String[] setMask(String[] source, int[]mask) {
String[] result = new String[mask.length];
for (int i = 0; i < mask.length; i++) {
result[i] = source[mask[i]];
}
return result;
}
结果:
[B,C,D,E,A]
[C,D,A,E,B]
其他方式,用枚举:
import static logging.ExampleLogging.Case.*;
public class ExampleLogging {
public enum Case {
A, B, C, D, E
}
public static void main(String[] args) {
Case[] mask_A = {A,B,C,D,E};
Case[] mask_B = {C,D,A,E,B};
String[] source = {"A", "B", "C", "D", "E"};
System.out.println(Arrays.asList(setMask(source,mask_A)));
System.out.println(Arrays.asList(setMask(source,mask_B)));
}
public static String[] setMask(String[] source, Case[]mask) {
String[] result = new String[mask.length];
for (int i = 0; i < mask.length; i++) {
result[i] = source[mask[i].ordinal()];
}
return result;
}
}