【问题标题】:How to remove repetition in output results in this code如何在此代码中删除输出结果中的重复
【发布时间】:2018-10-16 10:05:32
【问题描述】:
public class ValidInvalidNodes {
public static void main(String[] args) {

    int[][] arr = { 
            { 5, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },             
            { 0, 5, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 0, 5, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, 
            { 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0 }, 
            { 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0 },        
            { 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0 },  
            { 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0 }, 
            { 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, 
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, 
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 1, 0, 0, 0, 0 }, 
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, -1, 0, 0, 0 },  
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, -1, 0, 0, 0 }, 
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, -1, 0, 0 }, 
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, -1, 0 }, 
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, -1 }, 
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, -1 }, 
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, -1 }, 
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5 }, 
    };
    int position = 0;
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arr[i].length; j++) {
            if (arr[i][j] == 1) {
                position = j;

                if (arr[position][j] == 5)

                    System.out.print(" Valid Static Node V" + j + " \n");

            }
            if (arr[i][j] == -1) {
                position = j;

                if (arr[position][j] == 5)

                    System.out.print(" InValid Static Node V" + j + " \n");
            }
            if (arr[i][j] == -1) {
                position = j;

                if (arr[position][j] == 55)

                    System.out.print(" InValid Mobile Node V" + j + " \n");
            }

            if (arr[i][j] == 1) {
                position = j;

                if (arr[position][j] == 55)

                    System.out.print(" Valid Mobile Node V" + j + " \n");  

            }

        }
    }
    // System.out.println("");
}

}

输出:

Valid Static Node V1 
 Valid Static Node V2 
 Valid Static Node V3 
 Valid Static Node V4 
 InValid Static Node V5 
 InValid Static Node V6 
 Valid Static Node V7 
 Valid Static Node V8 
 Valid Static Node V9 
 Valid Mobile Node V10 
 InValid Static Node V11 
 InValid Mobile Node V12 
 InValid Static Node V16 
 InValid Static Node V16 
 InValid Static Node V13 
 InValid Static Node V13 
 Valid Static Node V14 
 Valid Static Node V14 
 Valid Static Node V14 
 Valid Static Node V14 
 InValid Static Node V15 
 InValid Static Node V15 
 InValid Static Node V16 
 InValid Static Node V17 
 InValid Static Node V18 
 InValid Static Node V18 
 InValid Static Node V18 

【问题讨论】:

  • 你的具体问题是什么?
  • 我猜你希望每个错误只输出一次。在这种情况下,不要直接打印错误,而是将它们保存在 Set 中,并在完成填充后打印 Sets 内容。
  • 这不是向社区提问的好方法。 Please visit how to ask
  • 哦,还有:请不要在 java 问题中添加不必要的 C-Tag。
  • @Stultuske 我的问题是删除输出中重复的结果。您可以在输出中看到: 无效静态节点 V16 无效静态节点 V16 无效静态节点 V13 无效静态节点 V13 有效静态节点 V14 有效静态节点 V14 有效静态节点 V14 有效静态节点 V14 无效静态节点 V18 无效静态节点 V18 无效静态节点V18

标签: java arrays algorithm


【解决方案1】:

您可以将所有行放在java.util.LinkedHashSet&lt;String&gt; 中。 Set 表示它只会保留不同的项目。我们使用LinkedHashSet 而不是常规的HashSet 的原因是为了保留输入顺序。

将它们全部添加到集合后,我们将它们打印出来。

这里修改你的代码:

int[][] arr = { 
        { 5, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },             
        { 0, 5, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
        { 0, 0, 5, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
        { 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, 
        { 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0 }, 
        { 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0 },        
        { 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0 },  
        { 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0 }, 
        { 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, 
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, 
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 1, 0, 0, 0, 0 }, 
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, -1, 0, 0, 0 },  
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, -1, 0, 0, 0 }, 
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, -1, 0, 0 }, 
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, -1, 0 }, 
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, -1 }, 
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, -1 }, 
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, -1 }, 
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5 }, 
};
java.util.Set<String> outputLines = new java.util.LinkedHashSet<>();
int position = 0;
for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr[i].length; j++) {
        if (arr[i][j] == 1) {
            position = j;

            if (arr[position][j] == 5)
                outputLines.add("Valid Static Node V" + j);
        }
        if (arr[i][j] == -1) {
            position = j;

            if (arr[position][j] == 5)
                outputLines.add("InValid Static Node V" + j);
        }
        if (arr[i][j] == -1) {
            position = j;

            if (arr[position][j] == 55)
                outputLines.add("InValid Mobile Node V" + j);
        }
        if (arr[i][j] == 1) {
            position = j;

            if (arr[position][j] == 55)
                outputLines.add("Valid Mobile Node V" + j);  
        }
    }
}

for(String outputLine : outputLines){
  System.out.println(outputLine);
}

将输出:

Valid Static Node V1
Valid Static Node V2
Valid Static Node V3
Valid Static Node V4
InValid Static Node V5
InValid Static Node V6
Valid Static Node V7
Valid Static Node V8
Valid Static Node V9
Valid Mobile Node V10
InValid Static Node V11
InValid Mobile Node V12
InValid Static Node V16
InValid Static Node V13
Valid Static Node V14
InValid Static Node V15
InValid Static Node V17
InValid Static Node V18

Try it online.


您还可以稍微简化嵌套循环内的 if 检查。例如:

position = j;
if (arr[i][j] == 1) {
    if (arr[position][j] == 5)
        outputLines.add("Valid Static Node V" + j);
    else if(arr[position][j] == 55)
        outputLines.add("Valid Mobile Node V" + j);
}
else if (arr[i][j] == -1) {
    if (arr[position][j] == 5)
        outputLines.add("InValid Static Node V" + j);
    else if (arr[position][j] == 55)
        outputLines.add("InValid Mobile Node V" + j);
}

Try it online.



由于 OP 后来要求提供没有任何库的解决方案,这里有一种替代方法:

// Loop over the diagonal
for(int diag = 0; diag < arr.length; diag++){
  String nodeType = arr[diag][diag] == 5?
                     "Static"
                    :
                     "Mobile"; // Assumes the nodeType is ALWAYS one of 5 or 55
  // Loop over the rows above the diagonal for the current column
  int node = 0;
  for(int row = 0; row < diag; row++){
    // Bitwise-OR the node with the current value
    //  0  | 0 remains 0
    //  0  | 1 becomes 1
    //  0  | -1 becomes -1
    //  1  | 1 remains 1
    //  -1 | -1 remains -1
    //  (NOTE: 1 | -1 becomes -1, but I assumed a column will never contain both a 1 and -1)
    node |= arr[row][diag];
  }
  String nodeValid = node == 1?
                      "Valid" 
                     :node == -1?
                      "Invalid"
                     :
                      null;
  // Only print the node if the column contained a 1 or -1:
  if(nodeValid != null)
    System.out.println(nodeValid + " " + nodeType + " Node V" + diag);
}

Try it online.

【讨论】:

  • 非常感谢。它现在正在工作。但是有没有其他方法可以在不使用 java.util.LinkedHashSet 的情况下解决这个问题。 ?
  • @Ali 你的意思是直接在哪里打印而不把数字保存到最后打印?
  • 是的。我不想使用任何包来解决这个问题
  • @Ali Ah 好的。嗯..是否保证输入矩阵只包含数字0, 1, -1, 5, 55
  • 是的。 0、1、-1、5、5只有这一套
猜你喜欢
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多