java - 为什么数组会被最后一个方法覆盖?

标签 java sorting

我正在按升序和降序对数组进行排序。我创建了两个方法并从 main 中调用它们。这些方法单独工作得很好,但是当我调用它们时,看起来最后一个方法会覆盖第一个方法的值。 我知道这应该很容易,但我不明白发生了什么。有人可以向我解释一下吗?

import java.lang.reflect.Array;

public class Test {

    public static void main(String[] args) {
        int[] mayor, menor;
        int[] array1 = new int[] {5,3,10,8,27,4,1 }; 

        mayor= ordenMayor(array1);
        menor= ordenMenor(array1);

        for(int i=0; i<mayor.length ;i++) {
            System.out.print(" "+mayor[i]+" ");
        }

        System.out.println("");
        for(int i=0; i<menor.length ;i++) {
            System.out.print(" "+menor[i]+" ");
        }

        System.out.println("");
        for(int i=0; i<array1.length ;i++) {
            System.out.print(" "+array1[i]+" ");
        }


    }


    public static int[] ordenMayor(int[] arrayM) {
        int[] arrayMayor=arrayM;
        int mayor;
        int index;

        for(int i=0; i<arrayMayor.length - 1;i++) {
        mayor=arrayMayor[i];
        index=i;
            for(int j=i; j<arrayMayor.length ;j++) {
                if(arrayMayor[j]>mayor) {
                    mayor=arrayMayor[j];
                    index=j;    
                }
            }
            arrayMayor[index]=arrayMayor[i];
            arrayMayor[i]=mayor;
        }
        return arrayMayor;
    }

    public static int[] ordenMenor(int[] arraym) {
        int[] arrayMenor=arraym;
        int menor;
        int index;

        for(int i=0; i<arrayMenor.length - 1;i++) {

        menor=arrayMenor[i];
        index=i;
            for(int j=i; j<arrayMenor.length ;j++) {
                if(arrayMenor[j]<menor) {
                    menor=arrayMenor[j];
                    index=j;    
                }
            }
            arrayMenor[index]=arrayMenor[i];
            arrayMenor[i]=menor;
        }
        return arrayMenor;
    }


}

第一个应该是降序,第二个应该是升序(是正确的),最后一个应该是未排序的数组。

1  3  4  5  8  10  27 
1  3  4  5  8  10  27 
1  3  4  5  8  10  27

最佳答案

问题出在您的 orderMayororderMenor 方法中。我将在这里讨论 orderMayor,因为它们都有相同的问题。

具体来说,该行

int[] arrayMayor = arrayM;

正在将arrayMayor重新分配为对arrayM的引用。注意!我说的是“引用”。这是因为这个赋值实际上并不复制数组的内容(更技术地说,它只复制数组对象的地址)。

您需要克隆数组,然后对其进行操作,例如:

int[] arrayMayor = arrayM.clone();

这会创建一个 shallow copy数组并将其分配给 arrayMayor,因此当您对数组进行操作时,它不会覆盖旧数组。

关于java - 为什么数组会被最后一个方法覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56710561/

相关文章:

java - Java 8 是否提供了一种根据特定条件重复功能的好方法?

mysql - 通过自定义函数对数据库中的查询结果进行排序

javascript - 按两列对 HTML 表格进行排序

c - 仅根据第一列对C中的二维数组进行排序

java - 如何设置平板电脑的选项卡布局图标大小

java - 是否可以要求 Hibernate 从 .hbm.xml 文件创建表?

c# - 将列表拆分为子列表,List.Contains() 找不到匹配项

python - 在 Pandas 中排序两次

java - 如何根据键对 GSON 数组进行排序?

java - 当一个@Transactional 注解的方法被多个实例并行命中时会发生什么?