Java 具有多个条件的三元运算符
Java ternary operator with multiple conditions
我是 Java 数据结构的新手,我需要一些帮助来使用三元运算符来处理多个条件,或者是否有更好的方法来解决我正在尝试做的事情。
基本上,我有一个文本文件,它放入一个二维数组中,并逐个字符地拆分每一行。
但是,我在使用条件语句检查行中的特定字符时遇到了一些问题。
这是我目前的算法。
for (int i = 2; i < lines.size() - 1; i++) {
String floorLine = lines.get(i);
int j = 0;
for(char coor : floorLine.toCharArray()) {
floor[i - 2][j] = (coor == '#') ? 0 : 1;
}
}
截至目前,我只检查是否有 # 行然后它将编码为 0 否则 1。但是,我想要这样的东西
floor[i-2][j] = (coor == '#') ? 0 floor[i-2][j] = (coor == 'X') ? 1 floor[i-2][j] = (coor == 'Z') ? 2 : 3
所以如果我使用普通的 if else 语句,我应该是这样的
if 2d array == ( coor == '#') encode as 0
if 2d array == ( coor == 'X') encode as 1
if 2d array == ( coor == 'Z') encode as 2
else encode as 3
如有任何建议或提示,我们将不胜感激!提前谢谢你。
条件表达式的形式为:
condition? value_if_true : value_if_false
当它们被链接起来时,它看起来像这样:
condition_1 ? value_if_1 : condition_2 ? value_if_2 : value_otherwise
所以我认为你的意思是:
floor[i-2][j] = (coor=='#' ? 0 : coor=='X' ? 1 : coor=='Z' ? 2 : 3);
对我来说,这很简单,可读性很好,但是很多人反对像这样使用条件运算符;如果它更复杂,你最好使用 if
语句。
Java 正在引入 switch expressions,这也适用于这种情况。
除了三元表达式链,我看到了两个替代方案:
- 预先计算的从 char 到 int 的映射。
- 如果结果是连续编号 0, 1, 2, ... 那么字符串中 char 的索引是可用的。
所以
Map<Character, Integer> map = new HashMap<>();
map.put('#', 0);
map.put('X', 1);
map.put('!', 2);
String enc = "#X!";
for (int i = 2; i < lines.size() - 1; i++) {
String floorLine = lines.get(i);
int j = 0;
for(char coor : floorLine.toCharArray()) {
floor[i - 2][j] = coor == '#' ? 0
: coor == 'X' ? 1
: coor == '!' ? 2
: 3;
floor[i - 2][j] = map.getOrDefault(coor, 3);
int e = enc.indexOf(coor);
floor[i - 2][j] = e == -1 ? 3 : e;
}
}
看起来你可以把你的替代品放在地图上。
static Map<Character, Integer> encodings = new HashMap<>();
static {
// static initializer, a way to populate the map easily, not the only way
encodings.put('#', 0);
encodings.put('X', 1);
encodings.put('Z', 2);
}
//and in your function
floor[i-2][j] = encodings.getOrDefault(coor, 3);
也可以抛出我将如何写这个。将条件拉入新方法。
floor[i - 2][j] = getNumberForCoor(coor);
private static int getNumberForCoor(char coor) {
switch (coor) {
case '#': return 0;
case 'X': return 1;
case 'Z': return 2;
default: return 3;
}
}
我是 Java 数据结构的新手,我需要一些帮助来使用三元运算符来处理多个条件,或者是否有更好的方法来解决我正在尝试做的事情。
基本上,我有一个文本文件,它放入一个二维数组中,并逐个字符地拆分每一行。
但是,我在使用条件语句检查行中的特定字符时遇到了一些问题。
这是我目前的算法。
for (int i = 2; i < lines.size() - 1; i++) {
String floorLine = lines.get(i);
int j = 0;
for(char coor : floorLine.toCharArray()) {
floor[i - 2][j] = (coor == '#') ? 0 : 1;
}
}
截至目前,我只检查是否有 # 行然后它将编码为 0 否则 1。但是,我想要这样的东西
floor[i-2][j] = (coor == '#') ? 0 floor[i-2][j] = (coor == 'X') ? 1 floor[i-2][j] = (coor == 'Z') ? 2 : 3
所以如果我使用普通的 if else 语句,我应该是这样的
if 2d array == ( coor == '#') encode as 0
if 2d array == ( coor == 'X') encode as 1
if 2d array == ( coor == 'Z') encode as 2
else encode as 3
如有任何建议或提示,我们将不胜感激!提前谢谢你。
条件表达式的形式为:
condition? value_if_true : value_if_false
当它们被链接起来时,它看起来像这样:
condition_1 ? value_if_1 : condition_2 ? value_if_2 : value_otherwise
所以我认为你的意思是:
floor[i-2][j] = (coor=='#' ? 0 : coor=='X' ? 1 : coor=='Z' ? 2 : 3);
对我来说,这很简单,可读性很好,但是很多人反对像这样使用条件运算符;如果它更复杂,你最好使用 if
语句。
Java 正在引入 switch expressions,这也适用于这种情况。
除了三元表达式链,我看到了两个替代方案:
- 预先计算的从 char 到 int 的映射。
- 如果结果是连续编号 0, 1, 2, ... 那么字符串中 char 的索引是可用的。
所以
Map<Character, Integer> map = new HashMap<>();
map.put('#', 0);
map.put('X', 1);
map.put('!', 2);
String enc = "#X!";
for (int i = 2; i < lines.size() - 1; i++) {
String floorLine = lines.get(i);
int j = 0;
for(char coor : floorLine.toCharArray()) {
floor[i - 2][j] = coor == '#' ? 0
: coor == 'X' ? 1
: coor == '!' ? 2
: 3;
floor[i - 2][j] = map.getOrDefault(coor, 3);
int e = enc.indexOf(coor);
floor[i - 2][j] = e == -1 ? 3 : e;
}
}
看起来你可以把你的替代品放在地图上。
static Map<Character, Integer> encodings = new HashMap<>();
static {
// static initializer, a way to populate the map easily, not the only way
encodings.put('#', 0);
encodings.put('X', 1);
encodings.put('Z', 2);
}
//and in your function
floor[i-2][j] = encodings.getOrDefault(coor, 3);
也可以抛出我将如何写这个。将条件拉入新方法。
floor[i - 2][j] = getNumberForCoor(coor);
private static int getNumberForCoor(char coor) {
switch (coor) {
case '#': return 0;
case 'X': return 1;
case 'Z': return 2;
default: return 3;
}
}