甚至在Java中将数组截断为给定的长度限制

时间:2015-01-13 17:44:21

标签: java arrays algorithm

我得到的数组比常数整数limit长。我需要将数组截断为limit长度。但后来,数组将包含线图的点。如果我得到很多分数,甚至不能在浏览器中显示,我想"缩小规模"那个数据。因此,我只希望以同样的扩展序列删除数据条目。

我试试这个:

final Object[] array = /* some array */;
final List<Object> result = "* some list */;
final int limit = /* some limit; but suppose that array.length > limit */
final double r = (array.length - limit) / (double) array.length;
double m = 0;
for(int i = 0; i < array.length; i++) {
    while(m >= 1) {
        m -= 1;
    }
    m += r;
    if(m < 1) {
        result.add(array[i]);
    }
}

问题是:结果的长度是limit,为什么不是?

2 个答案:

答案 0 :(得分:4)

这可能会起到作用:

public static <T> List<T> limitArray(T[] array, int limit) {
    if (limit > array.length) {
        return Arrays.asList(array);
    }
    List<T> list = new ArrayList<T>();
    double stepSize = ((double) array.length - 1) / ((double) limit - 1);
    double i = 0;
    while (i < array.length) {
        list.add(array[(int) i]);
        i += stepSize;
    }
    return list;
}

为什么array.length - 1limit - 1
因为总是添加第一个和最后一个元素,所以剩余部分将被均匀分配 既然你说&#34;数组将包含线图&#34; 的点,我认为最好保留第一个和最后一个元素,以保持整个宽度图。

由于分割的结果有限精度double,因此数组可能只有一个元素太少。在这种情况下,这是一个可能的解决方案:

  • list.add(array[(int) i])替换为list.add(array[(int) Math.round(i)])。请注意,这样做也会影响要添加到列表中的数组的其他索引。

旧答案:
你为什么不这样做?:

public <T> List<T> limitArray(T[] array, int limit) {
    List<T> list = new ArrayList<T>();
    int i = 0;
    while (i < arrary.length && i < limit) {
        list.add(array[i]);
        i++;
    }
    return list;
}

答案 1 :(得分:3)

保持求和双倍是一个坏主意,因为你可能因为舍入误差而出现故障。以MC Emperor的回答为基础:

public <T> List<T> limitArray(T[] array, int limit) {
    List<T> list = new ArrayList<T>();
    int i = 0;
    double scale = array.length * 1.0/limit;
    while (i < limit) {
        list.add(array[(int)(i * scale)]);
        i++;
    }
    return list;
}

这可以保证您均匀分布项目,并且您拥有limit个项目。 *1.0是强制加倍的。