【问题标题】:Java 2Dimensional String array: find column where all elements are the sameJava 2维字符串数组:查找所有元素都相同的列
【发布时间】:2016-12-27 20:52:11
【问题描述】:

我很确定这个问题已经被问过了,但我似乎找不到可以帮助我解决问题的解决方案。

我得到了一个二维字符串数组。

String[][] available = new String[10][15];

数组包含单词 : ok 和 no,每个元素之间有一个制表符。这是它的外观:

ok  ok  no  ok  ok  no  ok  ok  ok  no  no  no  ok  ok  ok
ok  no  ok  no  ok  ok  ok  no  ok  ok  no  ok  ok  no  ok
ok  ok  ok  ok  no  no  no  no  no  ok  no  ok  ok  no  ok
ok  no  ok  ok  no  no  no  no  no  ok  no  ok  ok  no  ok
no  no  ok  ok  no  no  no  no  no  ok  no  ok  ok  ok  ok
ok  ok  ok  ok  no  ok  no  no  no  ok  no  ok  ok  no  ok

现在有多个列,整个列都填充了 ok。 我实际上只需要每个元素都可以的第一列。

字符串可能会在以后扩展,所以我需要在带有 .length 的 for 循环中使用它 此代码打印出正确的列,但问题是当数组扩展时这将不起作用:

    for (int r =0; r < 10; r++){
        for (int k = 0; k < 15; k++){
            if ( "ok" == poll[r +0][k] && 
                 "ok" == poll[r +1][k] &&
                 "ok" == poll[r +2][k] &&
                 "ok" == poll[r +3][k] && 
                 "ok" == poll[r +4][k] &&
                 "ok" == poll[r +5][k] &&
                 "ok" == poll[r +6][k] &&
                 "ok" == poll[r +7][k] &&
                 "ok" == poll[r +8][k] &&
                 "ok" == poll[r +9][k] ){
                System.out.println(k);
            }            
        }
    }

【问题讨论】:

    标签: java arrays string for-loop 2d


    【解决方案1】:

    你可以这样做:

    int columnNumber = -1;    
    
    for (int column = 0; column < available.length; column++) {
    
        boolean columnYes = true;        
    
        for (int row = 0; row < available.length; row++) {
            if (!available[row][column].equals("yes")) {
                columnYes = false;
            }
        }
    
        if (columnYes) {
            columnNumber = column;
            break;
        }
    }
    

    此代码将搜索所有元素均为"yes"第一个列并返回其索引,对于列编号写入@ 987654323@。如果没有这样的列,您会得到-1。请记住,您的列必须全部大小相等(正如我从您的问题中了解到的那样),以上代码才能正常工作。

    您还应该考虑将数组设为boolean[]enum Choice[],并根据其值在单独的函数中返回String,而不是一遍又一遍地存储相同的字符串,这会消耗大量内存并且不能轻易改变。此外,在这种情况下比较字符串只会不必要地降低性能。

    【讨论】:

    • 列号类似于每个人都有空的日期。我需要每个人都有空的第一次约会。所以我确实只需要第一列
    • 对不起,我对编程很陌生,我不明白如何检索所有元素都等于“是”的列。
    【解决方案2】:

    我不完全确定我理解了你的问题,但这应该可以工作(尽管可能有更好的算法来完成这项任务)。

    int counter = 0;
    
    for (int row = 0; row < 10; row++) {
        for (int col = 0; col < 15; col++) {
            if (available[row][col].equals("ok") == false) break;
            else counter++;
        }
    
        if (counter == 15) return row;
    }
    
    return -1; // no row has *all* columns set to "yes"
    

    如果您想计算发生这种情况的行数(而不是第一行),只需添加一个额外的计数器并在最后返回它。

    虽然,就像@thatguy 所说,你最好还是使用布尔矩阵。

    【讨论】:

    • 休息有什么作用?
    • 这将输出列是所有元素都是“否”的。我实际上只需要 ok 的。
    • 您对原始问题还不是很清楚,但是该方法应该做的是遍历矩阵并返回其所有列均为“是”(或“ ok" 或 w/e)。
    • 如果检测到“否”,则 break 会中断第二个循环。
    猜你喜欢
    • 2016-11-15
    • 2021-11-16
    • 1970-01-01
    • 2021-05-12
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2015-08-22
    相关资源
    最近更新 更多