使用排序方法逻辑时,并非所有数组元素都显示

时间:2013-09-01 03:08:06

标签: java arrays

我有这个代码;

他们都使用system.out.println语句打印出数组元素。最初我使用带有Arrays.toString(array)的return语句来显示主方法中运行正常的数组。现在我想使用print语句来降低复杂程度。正如您所看到的,输出表单sort缺少数组中的最后一个元素,这是因为我使用的是array.length -1。但是,如果我不使用array.length -1,我会得到一个.ArrayIndexOutOfBoundsException,所以任何人都有一个实际的解决方案吗?

import java.util.Arrays;
public class SortMethod
{
    static int[] array = {2,1,5,3,5};


    public void sort(int[] arrays)
    {

        for(int i = 0;i < arrays.length - 1;i++ )
        {
            int store = 0;
            if (arrays[i + 1 ] < arrays[i])
            {
                store = arrays[i];
                arrays[i] = arrays[i + 1];
                arrays[i + 1] = store;

            }
            System.out.print(arrays[i]);
        }

        System.out.println();
    }

    public void reverse (int[] arrays)
    {   
        for (int i=arrays.length-1; i >=0; i--)
        {
            System.out.print(arrays[i]);
        }


    }
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub

        SortMethod sort = new SortMethod();
        sort.sort(array);
        sort.reverse(array);

    }

}

输出

From Sort:1235
From Reverse:55321

5 个答案:

答案 0 :(得分:2)

首先,您的排序方法实际上并没有正确排序。您可以使用左侧的值立即检查值,但如果列表末尾有4,会发生什么?

  

{2,1,5,3,5,4}

会返回结果:

  

123545

几乎没有排序......您需要获取切换的每个值,并向后检查它,并确保它不会小于之前的值。现在你将值排序到右边,但从不回到左边。

此外,您可以只进行排序算法,然后在数组之后迭代并打印值,而不是尝试在排序方法的中间打印它们:

public class TestCode
{
static int[] array = {2,1,5,3,5,4,9,1,99,7};


public void sort(int[] arrays)
{

    for(int i = 0; i < arrays.length - 1 ;i++ )
    {
        int store = 0;
        // Move larger values to the right
        if (arrays[i] > arrays[i + 1])
        {
            store = arrays[i];
            arrays[i] = arrays[i + 1];
            arrays[i + 1] = store;
            // Sort swapped smaller values to the left
            for(int j = i; j > 1; j--)
            {
                if (arrays[j] < arrays[j - 1])
                {
                    store = arrays[j];
                    arrays[j] = arrays[j - 1];
                    arrays[j - 1] = store;
                }
            }

        }
    }

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

public void reverse (int[] arrays)
{   
    for (int i=arrays.length-1; i >=0; i--)
    {
        System.out.print(arrays[i] + " ");
    }


}
/**
 * @param args
 */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub

        TestCode sort = new TestCode();
        sort.sort(array);
        sort.reverse(array);

    }

}

给出输出:

  

1 1 2 3 4 5 5 7 9 99

     

99 9 7 5 5 4 3 2 1 1

内容:

排序数组时,您需要迭代数组array.length - 1次以比较值(您不需要将最后一个值与其右侧的值进行比较,因为没有一个值)。

打印数组时,需要迭代array.length次并打印出每个值。您的主要问题来自于尝试在排序算法中打印出数组,该算法只能在数组array.length - 1内迭代,而您可能只是在排序算法之外打印数组。

答案 1 :(得分:1)

public void sort(int[] arrays)函数的最后一行:

   System.out.println();

应该是

System.out.println(arrays[arrays.length - 1]);

因为你想打印孔阵列。

对于记录,public void sort(int[] arrays)函数实际上排序数组。通过检查和交换相邻元素的一遍,sort不应该做什么。

例如,如果array初始化为:

static int[] array = {2,1,5,3,5};

生成的sort数组为:53215,反向数组为51235。两者都不是预期的结果。

答案 2 :(得分:1)

sort()中,您将从0迭代到 arrays.length-1 独占),因此对于arrays.length = = 5变量 i 将取值:0,1,2,3

reverse()中,您从 arrays.length-1 包含)迭代到0 - i 将取值:4,3,2,1,0。

当您从 sort()中的 arrays.length-1 中删除 -1 部分时,您将获得ArrayOutOfBoundsException,因为您引用了 array [i + 1] ,它将超出数组范围,适用于i == 4.

答案 3 :(得分:1)

按如下方式更改排序方法:

public void sort(int[] arrays) {
        // int i = 0;
        for (int i = 0; i < arrays.length - 1; i++) {
            int store = 0;
            if (arrays[i + 1] < arrays[i]) {
                store = arrays[i];
                arrays[i] = arrays[i + 1];
                arrays[i + 1] = store;

            }
            System.out.print(arrays[i]);
            if (i + 1 == arrays.length - 1) {
                System.out.print(arrays[i + 1]);
            }
        }

        System.out.println();
    }

刚刚添加了新的打印声明

if (i + 1 == arrays.length - 1) {
System.out.print(arrays[i + 1]);
}  

打印最后一个数组元素。

答案 4 :(得分:1)

首先,我想指出代码是不完整的。这只是排序代码的一半,我可以看到你正在尝试使用冒泡排序,但不幸的是内部循环丢失了。

除此之外,此代码中没有问题。

你能用下面给出的方法替换你的排序方法吗?这将解决所有问题。

 public void sort(int[] a){
    int temp = 0;
    for(int i = 0 ; i < a.length ; i++){
      for(int j = 0 ; j< a.length - 1 ; j++){
        if(a[j] > a[j+1]){
          temp = a[j];
          a[j] = a[j+1];
          a[j+1]=temp;
        }

      }

    }
    printArray(a);
  System.out.println();
}


public void printArray(int[] a){
    for(int i = 0 ; i < a.length ; i++){
        System.out.print(a[i]);
    }
}

另外,我建议你阅读有关排序技巧的内容。您随时可以访问Sorting articles