函数多次使用后,函数未返回期望值

时间:2020-07-26 10:30:53

标签: java function

当我两次使用sortAsc_byPosition函数

public class stringArraySort {
    public static String[] sortAsc_byPosition(String[] str, int charPosition) {
        for(int r=0; r<str.length-1; r++) {
            for(int i=r+1; i<str.length; i++) {
                int j=charPosition;
                while (str[r].charAt(j)==str[i].charAt(j)) {
                    j++;
                }
                if (str[r].charAt(j)>str[i].charAt(j)) {
                    String tmp=str[i];
                    str[i]=str[r];
                    str[r]=tmp;
                }
            }
        }
        return str;
    }

    public static void main(String[] args) {
        String[] productID= {"Xcra-S1836", "Zkda-D3426", "Ypdu-B5654", "Akdr-Z5075", "Jhbd-K4051"};
        String[] result1=sortAsc_byPosition(productID, 5);
        String[] result2=sortAsc_byPosition(productID, 6);
        
        System.out.println("Result of array sorted by character position at 5 :" + Arrays.toString(result1));
        System.out.println("Result of array sorted by character position at 6 :" + Arrays.toString(result2));
    }

要获得所需的结果,该功能无法实现。

但是,当我只使用一次该功能时,它就可以工作。

public static void main(String[] args) {
        String[] productID= {"Xcra-S1836", "Zkda-D3426", "Ypdu-B5654", "Akdr-Z5075", "Jhbd-K4051"};
        String[] result1=sortAsc_byPosition(productID, 5);
        
        System.out.println("Result of array sorted by character position at 5 :" + Arrays.toString(result1));
    }

此问题的主要原因是什么?正确的制作方法是什么?感谢您的回答...

1 个答案:

答案 0 :(得分:3)

您的sortAsc_byPosition方法接受一个数组,对该数组进行更改并返回相同的数组。这意味着result1 == result2(两个变量都是对同一数组对象的引用)。

因此,当您两次执行该方法时,最后将看到的结果是第二个调用使用的排序顺序。

如果要具有两个不同顺序的不同数组,则应返回该数组的副本。

例如:

public static String[] sortAsc_byPosition(String[] str, int charPosition) {
    String[] result = Arrays.copy(str,str.length);
    for(int r=0; r<result.length-1; r++) {
        for(int i=r+1; i<result.length; i++) {
            int j=charPosition;
            while (result[r].charAt(j)==result[i].charAt(j)) {
                j++;
            }
            if (result[r].charAt(j)>result[i].charAt(j)) {
                String tmp=result[i];
                result[i]=result[r];
                result[r]=tmp;
            }
        }
    }
    return result;
}