如何找到多维数组中最大的10个元素?

我希望这会打印一个最大的值。但它需要 3D 数组中 10 个最大的元素。


public class foo{

    Public static void main(String[] args){


        int row,col,dep=3;

        int[][][] value=new int[row][col][dep];


        /* insert the value from user or initialize the matrix*/

        int max=0;

        for(row=0;row<3;row++)

            for(col=0;col<3;col++)

                for(dep=0;dep<3;dep++)

                    if(value[row][col][dep]>max)

                        max=value[row][col][dep];

        System.out.println(max);

    }

}


明月笑刀无情
浏览 122回答 3
3回答

慕田峪9158850

您可以将所有整数添加到 a 中List<Integer>,对其进行排序,然后获取它的 X 最大个数:public class foo {&nbsp; &nbsp; public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; int row = 3, col = 3, dep = 3;&nbsp; &nbsp; &nbsp; &nbsp; int[][][] value = new int[row][col][dep];&nbsp; &nbsp; &nbsp; &nbsp; value[1][2][1] = 10;&nbsp; &nbsp; &nbsp; &nbsp; value[1][0][1] = 15;&nbsp; &nbsp; &nbsp; &nbsp; List<Integer> listWithAll = new ArrayList<>();&nbsp; &nbsp; &nbsp; &nbsp; /* insert the value from user or initialize the matrix*/&nbsp; &nbsp; &nbsp; &nbsp; int max = 0;&nbsp; &nbsp; &nbsp; &nbsp; for (row = 0; row < 3; row++)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (col = 0; col < 3; col++)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (dep = 0; dep < 3; dep++)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listWithAll.add(value[row][col][dep]);&nbsp; &nbsp; &nbsp; &nbsp; listWithAll.sort(Collections.reverseOrder());&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < 10; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(listWithAll.get(i));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}打印:15 10 0 0 0 0 0 0 0 0或仅使用 Java 8 流:List<Integer> max10 = listWithAll.stream()&nbsp; &nbsp; &nbsp; &nbsp; .sorted(Collections.reverseOrder())&nbsp; &nbsp; &nbsp; &nbsp; .limit(10)&nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toList());max10.forEach(System.out::println);

忽然笑

这是一种使用 来做到这一点的方法streams。我使用了完整的 2 x 2 x 2 数组以使其更容易,但它适用于任何int[][][]数组。我没有使用嵌套循环,而是只使用flatMapped数组。初始化数组。&nbsp; &nbsp; &nbsp; int[][][] v = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}};现在获取前 4 个值(或前 N 个值)并将它们放入列表中。&nbsp; &nbsp; &nbsp; int top4 = 4;&nbsp; &nbsp; &nbsp; List<Integer> top4Max =&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Arrays.stream(v).flatMap(Arrays::stream).flatMapToInt(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Arrays::stream).boxed().sorted(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Comparator.reverseOrder()).limit(top4).collect(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Collectors.toList());&nbsp; &nbsp; &nbsp; System.out.println(top4Max);印刷8 7 6 5剥离Arrays.stream一层数组。将 flatMap它们进一步扁平化为数组single dimenion。将flatMapToInt其扁平化,将stream of ints其分类并加工成有限的集合。如果需要,您还可以将它们放入数组而不是列表中。

慕尼黑的夜晚无繁华

或者,可以创建一个小数组并将其与普通的 findmax 函数一起使用。public class Array_3D {&nbsp; &nbsp; public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; int row = 3, col = 3, dep = 3;&nbsp; &nbsp; &nbsp; &nbsp; int[][][] value = new int[row][col][dep];&nbsp; &nbsp; &nbsp; &nbsp; value[1][2][1] = 10;&nbsp; &nbsp; &nbsp; &nbsp; value[1][0][1] = 15;&nbsp; &nbsp; &nbsp; &nbsp; int[] topten = new int[10];&nbsp; //array to hold max values&nbsp; &nbsp; &nbsp; &nbsp; int count = 0;&nbsp; &nbsp; &nbsp; &nbsp; int candidate = 0;&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < row; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int j = 0; j < col; j++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int k = 0; k < dep; k++) {&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (count < 10) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//start with first ten values&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; topten[count] = value[i][j][k];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; candidate = value[i][j][k];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int x = 0; x < 10; x++) {&nbsp; &nbsp;//loop for loading top values&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (candidate > topten[x]) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; topten[x] = candidate;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//exit on first hit&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < 10; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.print(topten[i] + " ");&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; System.out.println();&nbsp; &nbsp; }}我不知道对于大型 3D 数组哪种方法更快;这里我们必须在 3D 数组中的每个点运行一个小循环,而不是创建一个全新的列表并对其进行排序。显然,这在内存使用方面获胜,但不确定速度。[编辑注意,这将按原样返回前十个值的未排序数组]。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java