Как удалить первые несколько элементов из массива строк? - PullRequest
2 голосов
/ 20 июня 2011

У меня есть метод, который принимает строковый массив и находит средние значения для каждого из нескольких элементов в зависимости от длины.Я хотел бы, чтобы метод удалял первые несколько элементов в массиве в зависимости от значения смещения.

public static double[] getMovingAverage(String[] priceList, int length, int offset){

    double[] newPriceList = convert(priceList);

    int listLength = newPriceList.length;
    int counter = 0;
    double listsum;
    double[] movingAverage = new double[listLength];

    try{
        for (int aa = 0; aa < listLength-1; aa++){
            listsum = 0;
            for (int bb = 0; bb < length; bb++){
                counter = aa+bb;

                listsum = listsum + newPriceList[counter];
            }
            movingAverage[aa] = listsum / length;
        }
        if (offset>0){

                        //remove first #offset# elements

        }
    }catch(Exception e){
        System.out.println(e);
    }
    return movingAverage;
}

* note: convert ();конвертирует String [] в double []

Ответы [ 6 ]

6 голосов
/ 20 июня 2011

Массивы фиксированной длины в Java. (Вы не можете изменить длину массива.)

Однако вы можете создать новый массив, удалив первые элементы offset довольно просто:

double[] movingAverage = { 0.1, 0.2, 1.1, 1.2 };
int offset = 2;

// print before
System.out.println(Arrays.toString(movingAverage));

// remove first offset elements
movingAverage = Arrays.copyOfRange(movingAverage, offset, movingAverage.length);

// print after
System.out.println(Arrays.toString(movingAverage));

Выход:

[0.1, 0.2, 1.1, 1.2]
[1.1, 1.2]
2 голосов
/ 20 июня 2011

вместо удаления элементов, почему бы просто не создать новый список меньшего размера в качестве вывода и всегда использовать смещение индекса в качестве индекса в нем?

2 голосов
/ 20 июня 2011

API Java 6

public static double [] copyOfRange (double [] original, int from, int to)

Копирует указанный диапазон указанного массива вновый массив.Начальный индекс диапазона (от) должен лежать между нулем и оригинальной длиной, включительно.Значение в оригинале [из] помещается в начальный элемент копии (кроме случаев, когда == original.length или от == до).Значения из последующих элементов в исходном массиве помещаются в последующие элементы в копии.Конечный индекс диапазона (до), который должен быть больше или равен от, может быть больше оригинальной. Длина, в этом случае 0d помещается во все элементы копии, индекс которой больше или равен оригиналу.длина - от.Длина возвращаемого массива будет до - от.

Параметры: оригинал - массив, из которого должен быть скопирован диапазон - начальный индекс диапазона, который будет скопирован, включительно - конечный индексиз диапазона, который будет скопирован, эксклюзив.(Этот индекс может находиться вне массива.)

Возвращает: новый массив, содержащий указанный диапазон из исходного массива, усеченный или дополненный нулями для получения требуемой длины

Броски: ArrayIndexOutOfBoundsException -если от <0 или от> original.length () IllegalArgumentException - если от> до NullPointerException - если оригинал равен нулю С: 1.6

1 голос
/ 20 июня 2011

Чтобы предотвратить копирование массивов, вы можете использовать класс коллекций, такой как LinkedList, с O (1) операциями удаления из заголовка.

http://download.oracle.com/javase/6/docs/api/java/util/LinkedList.html

1 голос
/ 20 июня 2011

Вы не можете явно удалить из массива, но вы можете использовать другую структуру данных, такую ​​как ArrayList, для накопления результатов.В вашем случае, тем не менее, вы можете просто изменить код для правильного размера массива, т.е.

 double[] movingAverage = new double[listLength-offset];

и

    for (int aa = 0; aa < listLength-offset; aa++){
1 голос
/ 20 июня 2011

Возможно, один из методов Arrays.copyOfRange () подойдет?

http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#copyOfRange(boolean[], int, int)

...