如何删除数组中的最小值?

时间:2012-10-15 23:59:17

标签: java arrays

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

    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;

5 个答案:

答案 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