我正在尝试删除数组中的最小值。我已遍历数组以找到最小值,但当我尝试删除它时,我得到了这个:
SportStacker.java:111: error: cannot find symbol
times.remove(slowestTime);
^
symbol: method remove(double)
location: variable times of type double[]
1 error
据我所知,当我只想删除给定索引处的double时,我告诉它删除double []。我怎么说我想删除包含最小值的索引处的double?这是我的方法代码。
public double removeSlowestTime() {
double slowestTime;
for (int i = 0; i < times.length; i++) {
if (times[i] == 0) {
continue;
}
else {
if (slowestTime < times[i]) {
slowestTime = times[i];
times.remove(slowestTime);
}
}
}
return slowestTime;
答案 0 :(得分:2)
数组没有remove()
方法,您可以使用ArrayList
或将该值设置为某个默认值,例如
times[someIndex] = null; // put any valid default value based on your array
答案 1 :(得分:2)
您尝试删除元素的方式似乎不正确。 尝试
times = ArrayUtils.removeElement(times, slowestTime);
如果您想进行大量此类操作,集合或 ArrayList 可能是您更好的方式。
答案 2 :(得分:0)
您无法使用以下方法从双数组中删除元素:
times.remove(slowestTime);
数组的大小固定,一旦创建,元素的数量就不能改变。
您可以构建一个新的double
数组。您可以保存数组中最慢时间的位置:
slowestIndex = i;
...
并在完成循环时创建新数组:
double[] newTimes = new double[times.length - 1];
for (int i=0, j=0; i < times.length - 1; i++) {
if (i != slowestIndex) {
newTimes[j++] = newTimes[i];
}
}
答案 3 :(得分:0)
您无法在数组上调用remove
,因为它不作为方法存在。没有简单的方法可以从数组中删除元素;我建议使用java.util.List
的实现,它提供remove
。
答案 4 :(得分:0)
正如本答案中其他地方所提到的,与JavaScript和Python等语言不同,Java中的数组在定义数组时定义了固定数量的元素。
int[] foo = new int[10]; // this array object will always have 10 elements
foo[0] = 42;
foo = new int[20]; // now foo refers to a different array
// object with 20 elements
return foo[0]; // so this will return the default int value, 0, not 42
如果要为数组寻找类似类型的对象,请使用ArrayList:
ArrayList<Integer> foo = new ArrayList<Integer>(); // this has zero elements
foo.add(42); // now it has one
foo.add(8675309); // now it has two
foo.remove(0); // now you've removed the first
return foo.get(0); // returns 8675309, because everything shifted over by one
但是如果您需要经常从列表中删除最低项目,并且您有很多项目且性能很重要,那么最好的选择是PriorityQueue
。这是一种始终按顺序从最小到最大的数据类型。这意味着插入一个项目(O(log n)
,或者与列表中项目数的对数成比例)需要更长的时间,但是要快速删除最少的项目(O(1)
,或者常量否无论列表有多长)。相比之下,使用列表时,添加项目(O(1)
)需要很短的时间,但在搜索最低项目时需要检查每个项目(O(n)
)。
PriorityQueue<Integer> foo = new PriorityQueue<Integer>();
foo.add(300);
foo.add(100);
foo.add(200);
int a = foo.remove(); // 100
int b = foo.remove(); // 200
int c = foo.remove(); // 300