0

我昨天发布了一个关于数组中索引排序的问题。我得到了奇怪的结果,这部分是正确的。我找到了原因,但我不知道如何解决它。

我已经声明了一个数组的最大索引数为 50。将数据读入文件后,只有 24 个左右填充了实际数据,其余的填充了 0。当我去打印时,所有 50 个索引都按升序列出。我不知道如何只打印带有数据的索引。

这是我昨天的问题的链接:将双数组排序为升序

下面是我对数组声明和初始化、排序循环和打印的代码。任何帮助都会很棒!

private double[] x;


x = new double[50];

int index, j = x.length - 1,double temp;

for (j = x.length - 1; j >= 0; j--) {
    for (index = 0; index <= j - 1; index++) {   //start for
        if (x[index] > x[index + 1]) {   //start if
            temp = x[index];
            x[index] = x[index + 1];
            x[index + 1] = temp;
        }
    }
}

for (index = 0; index < x.length; index++) {
    System.out.printf("%3d. \t\t%5.1f%%\n", (index + 1), x[index]);
}
4

3 回答 3

1

使用 anArrayList而不是数组。这会跟踪添加的项目,因此您无需重新发明标准库。如果您确实需要使用数组,请保留项目数量并仅打印您拥有的项目数量。

于 2013-07-16T13:26:05.077 回答
1

由于所有数组索引都初始化为 0,因此您的排序算法会将所有没有数据的索引(基本上是 0)移动到数组的前面,在您添加的值之前 - 正如所指出的,它也可能包含 0。然后,您的 print 方法将打印整个数组,因为您从数组的末尾开始index=0并一直移动到数组的末尾。

我建议如下:向数组添加数据时,保留一个count变量来跟踪您添加了多少值(即count++每次添加新值时执行),然后对数组进行排序。

然后像这样打印:

for (index = x.length-count; index < x.length; index++) {
    System.out.printf("%3d. \t\t%5.1f%%\n", (index + 1), x[index]);

}

因此,您只打印出您自己添加的数据,而不是空索引。

于 2013-07-16T14:14:07.107 回答
1

我看到两个选项:

  1. 您可以使用ArrayList。这是一个动态数据结构,随着您投入的项目越多,它的大小就会不断增加。完成后,您只需遍历 ArrayList 并打印其内容。或者

  2. 填充数组时,您会跟踪实际添加了多少项。然后从 0 迭代到这个数字,而不是整个数组的大小。

于 2013-07-16T13:26:31.100 回答