我得到的数组比常数整数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
,为什么不是?
答案 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 - 1
和limit - 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
是强制加倍的。