我有这个代码;
他们都使用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
答案 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