簡體   English   中英

具有多個條件的Java三元運算符

[英]Java ternary operator with multiple conditions

我對Java數據結構還很陌生,我需要一些幫助來使用三元運算符來處理多個條件,或者是否有更好的方法來解決我要執行的操作。

基本上,我有一個文本文件,該文件放入2D數組中,並逐字符拆分每行字符。

但是,我在使用條件語句檢查行中的特定字符時遇到了一些麻煩。

這是我目前的算法。

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 else 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

任何建議或技巧將不勝感激! 先感謝您。

也可以提出我將如何編寫此內容。 將條件插入新方法。

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

條件表達式的形式為:

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表達式 ,在這種情況下也可以很好地工作。

除了三元表達鏈,我看到了兩種選擇:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM