0

我对Java的所有行为都不是很熟悉,如果我犯了一个明显的错误,我很抱歉。基本上我正在制作一个程序,它给出一个项目列表和范围,它计算可用于包括所有项目的百分比。例如,如果你有一篮子水果,想放苹果、梨、桃子,其中没有低于 20% 且没有高于 60% 的项目,程序会告诉你。

为了做到这一点,我有一个具有下限(最小百分比)和上限(最大百分比)的列表。我的问题是当我手动创建列表时它似乎工作(使用上面的示例,3 个项目,20-60 范围我得到 41 个项目),但是当我使用时Arrays.fill我得到 882 个结果(这是错误的,因为它包括 0 而不是尊重下限)。

我不确定问题是什么......我调查了一下Arrays.fill,它似乎做了我想要的,我还在两种情况下(手动与 Arrays.fill)列出了列表中的项目,它们看起来都一样。

这是差异(工作版本):

static final String[] names = new String[] {"apples", "pears", "peach" }; //test
static final int[] low_bound = new int[] {20,20, 20}; //this allows us to invididually set the range of each item
static final int[] high_bound = new int[] {60,60, 20};

不工作版本:

static final String[] names = new String[] {"apples", "pears", "peach" }; 
static int[] low_bound = new int[names.length];
static int[] high_bound = new int[names.length];
//then in the main method
Arrays.fill(low_bound, 20); //fills the min list with default value
Arrays.fill(high_bound, 60); //fills the max list with default value

为什么结果不一样?这些是工作版本和损坏版本之间的唯一变化。我想使用大列表并且不想手动输入数据(但我喜欢根据需要制作单个范围的灵活性),我使用 Arrays.fill 错误还是其他一些新手错误?

4

2 回答 2

4

您正在比较 Apples 和 Oranges,对于您的静态测试,high_bound值是{60, 60, 20}但是当您使用 时Arrays.fill(),您将其设置为 {60, 60, 60}。

于 2012-05-25T18:16:14.343 回答
1

这是没有意义的,因为 Array.fill 代码是:

    public static void fill(long[] a, long val) {
        for (int i = 0, len = a.length; i < len; i++)
            a[i] = val;
    }

结果数组看起来与静态初始化完全相同。

此外,我在初始化时运行了您的代码并得到了相同的结果:“结果的总大小为 882”

于 2012-05-25T18:15:30.187 回答