【问题标题】:How do I print all the occurrences of the greatest two integers in an array?如何打印数组中所有出现的最大两个整数?
【发布时间】:2019-09-28 07:02:10
【问题描述】:

我正在尝试打印整数数组中两个最高整数的出现,但输出始终与前三个一起出现。

Integer[] scores = {4,4,4,6,6,4,2,3};
        Arrays.sort(scores, Collections.reverseOrder());

        int flag = 0;
        System.out.println(scores[0]);
        int first = scores[0];

        for (int i = 1; i < scores.length; i++) {;
            if(first == scores[i]) {
                System.out.println(scores[i]);
            }else {
                first = scores[i];
                flag++;
                System.out.println(scores[i]);
            }
            if(flag == 2) {
                break;
            }
        }

有没有更好的方法来打印它们?它们目前打印为 6 6 4 4 4 4 3。 正确的输出应该是 6 6 4 4 4 4

【问题讨论】:

    标签: java arrays sorting find-occurrences


    【解决方案1】:

    问题是您将标志增加到 2 后的System.out.println(scores[i])。当这是列表中的第三个数字时,您不应该打印。

    我已将代码更改/简化为

    int flag = 0;
    int first = scores[0];
    for (int i = 0; i < scores.length; i++) {
        if(first != scores[i]) { //Encountering second number
            first = scores[i];
            flag++;
        }
        if(flag == 2) { //If already seen three numbers, break
            break;
        }
        System.out.println(scores[i]); //Good to print it
    }
    

    first 重命名为number 或其他名称更直观,因为它可以容纳第一个或第二个数字。

    【讨论】:

      【解决方案2】:

      整数[] 分数 = {4,4,4,6,6,4,2,3}; Arrays.sort(scores, Collections.reverseOrder());

          int flag = 0;
          System.out.println(scores[0]);
          int first = scores[0];
          for (int i = 1; i < scores.length; i++) {;
              if(first == scores[i]) {
                  System.out.println(scores[i]);
              }else if(first != scores[i] && flag == 0) {//you need to change this 
                  first = scores[i];
                  flag++;
                  System.out.println(scores[i]);
              }else{ // if you dont want to traverse list after getting desired output
                  break;
              }
      
          }
      

      【讨论】:

        【解决方案3】:

        我更喜欢int[] 而不是Integer[],并向后迭代排序后的数组。您实际上在这里不需要else,只需检查您是否不在数组的末尾 - 如果您没有检查当前分数与下一个分数不同(因为我们正在向后迭代)。您只需要在满足该条件时测试flag(以及在第二次更改后测试break)。喜欢,

        int[] scores = { 4, 4, 4, 6, 6, 4, 2, 3 };
        Arrays.sort(scores);
        for (int i = scores.length - 1, flag = 0; i >= 0; i--) {
            if (i != scores.length - 1 && scores[i] != scores[i + 1]) {
                flag++;
                if (flag >= 2) {
                    break;
                }
            }
            System.out.println(scores[i]);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-02-07
          • 2014-04-22
          • 1970-01-01
          • 2019-02-09
          • 2019-09-03
          • 2021-08-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多