2

我正在尝试删除数组中的最小值。我已经遍历数组以找到最小值,但是当我尝试删除它时,我得到了这个:

    SportStacker.java:111: error: cannot find symbol
            times.remove(slowestTime);
                 ^
    symbol:   method remove(double)
    location: variable times of type double[]
    1 error

据我所知,当我只想在给定索引处删除双精度时,我会告诉它删除双精度[]。我怎么说我想删除包含最小值的索引处的双精度数?这是我的方法的代码。

     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;
4

5 回答 5

2

数组没有remove()方法,您可以使用ArrayList该值或将该值设置为某个默认值,例如

times[someIndex] = null; // put any valid default value based on your array
于 2012-10-16T00:01:19.170 回答
2

您尝试删除元素的方式似乎不正确。尝试

times = ArrayUtils.removeElement(times, slowestTime);

如果您想做很多这样的操作,CollectionArrayList可能是更好的方法。

于 2012-10-16T00:01:25.033 回答
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];
       }
    }
于 2012-10-16T00:01:51.843 回答
0

您不能调用remove数组,因为它不作为方法存在。没有简单的方法可以从数组中删除元素;我建议使用 的实现java.util.List,它提供诸如remove.

于 2012-10-16T00:03:37.527 回答
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
于 2012-10-16T01:47:48.927 回答