【问题标题】:Java ternary operator with multiple conditions具有多个条件的Java三元运算符
【发布时间】:2020-01-19 07:15:41
【问题描述】:

我对 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

任何建议或提示将不胜感激!提前谢谢你。

【问题讨论】:

  • 虽然可以在 Java 中嵌套三元语句,但通常不会这样做,因为它们很快就会变得非常难以阅读。可读性胜过简洁。如果你不嵌套它们,以后你会感谢你的。
  • 你应该改用 switch-case
  • 您能否在更高的层次上描述一下代码在做什么?在我看来,它有点像“在整个文本中用这些数字替换这些字符”,除非函数的性能绝对关键,否则 text.replaceAll(char,replaceChar) 会更好地工作
  • JonK 我同意这一点,我只是想知道是否可以像使用三元运算符那样做。 @Deltharis 基本上就像文本文件中的一个谜题,这就是为什么我将它们映射到二维数组然后相应地编码特定字符的原因。该程序的主要目标是获取拼图的所有可能路径。

标签: java multidimensional-array conditional-statements ternary-operator


【解决方案1】:

不妨说说我将如何写这篇文章。将条件拉入新方法。

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;
    }
}

【讨论】:

  • 但问题是,我从这条线上得到坐标:for(char coor : floorLine.toCharArray())我如何从 floorLine 得到坐标?
【解决方案2】:

看起来你可以把你的替代品放在地图上。

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);

【讨论】:

  • 我的问题是整数值 3 可能远离其他值。如果我决定这些值应该以 1 为索引,那么很容易忘记将默认值更改为 4。
【解决方案3】:

除了三元表达式链,我还看到了两个替代方案:

  • 从 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;
    }
}

【讨论】:

    【解决方案4】:

    条件表达式的形式为:

    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,这也适用于这种情况。

    【讨论】:

    • 我会在代码审查中失败。某事不应该仅仅因为它可以是单行的。
    • @khelwood Java 几天前得到了这些;)
    • @AndrewTobilko 我的工作岗位需要几年才能赶上。
    • 我其实很喜欢这篇单行本,我能读得透彻,正是我要找的条件。谢谢你!
    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 2012-09-14
    • 2013-06-06
    • 2011-06-26
    • 2013-01-14
    • 2014-10-19
    相关资源
    最近更新 更多