Как удалить последний элемент в массиве и поставить новый впереди? - PullRequest
0 голосов
/ 29 мая 2020

У меня вопрос по Java. Я начал новичок в Java, и мой поиск в Google дал много результатов, но это не было последней помощью. Я создал класс для отслеживания исторической информации. У меня разные значения для разных дней, и мне нужно регулярно их обновлять. Я хочу отслеживать последние 30 дней и создал массив из 30 элементов. Когда я вызываю свою функцию "shift", я хочу отбросить последние n элементов и поставить нули впереди. Вот небольшой пример на 5 дней:

public class Testclass {

    private int[] histInfo;

    public Element()
    {
        this.histInfo = new int[5];
    }

    public void shift_histInfo(long m)
    {
        //do magic 
    }
}

Я хочу, чтобы shift сделал

INPUT:
histInfo = [50,21,1,45,901]

OPERATION:
shift_histInfo(2);

RESULT:
histInfo = [0,0,50,21,1]

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

Лучшее: -)

Ответы [ 4 ]

1 голос
/ 29 мая 2020

Если нет очень жестких ограничений производительности, использование стандартных классов Collection выполнит свою работу. Взгляните на java .util.LinkedList.

В качестве упражнения по программированию вы можете рассмотреть возможность создания кольцевого буфера. Идея состоит в том, чтобы избегать копирования массива при каждой вставке.

Сохраните значение старейшегоIndex.

При записи просто замените элемент [oldIndex] и увеличьте oldIndex.

Чтобы выполнить итерацию, вы начинаете с старейшегоIndex и используете метод приращения для обработки упаковки округлить до начала массива.

int nextIndex(int current) {
   return (current + 1) % arrayLength;
}

Хорошим упражнением было бы написать хороший инкапсулирующий класс, чтобы скрыть все это.

0 голосов
/ 29 мая 2020

Для ограничений, которые вам нужны, хотя я инициализировал данные тем же методом вместо Element(). Я не знаю, почему параметр имеет тип long, поэтому я оставил его и создал локальную переменную int.

Все, что он делает, это копирует значение индекса в новый массив, начиная с m затем увеличивает / выполняет итерацию до конца массива.

Вы также можете сделать метод возвращаемого типа int[], а затем просто вернуть changedInfo массив. Вместо histInfo = changedInfo.clone();

private int[] histInfo;

    public void shift_histInfo(long m) {
        int n = (int) m;
        this.histInfo = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15};

        int length = this.histInfo.length;
        int[] changedInfo = new int[length];

        if (length - n >= 0) System.arraycopy(histInfo, 0, changedInfo, n + 0, length - n); //Edit: shortened to one line.

        histInfo = changedInfo.clone();
        System.out.println("Remove: " + n + " - " + Arrays.toString(changedInfo) + "\n");

    }
    public static void main(String[] args) {
        Main main = new Main();
        main.shift_histInfo(0);
        main.shift_histInfo(30);
        main.shift_histInfo(1);
        main.shift_histInfo(15);
        main.shift_histInfo(29);
    }

println:

Remove: 0 - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

Remove: 30 - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Remove: 1 - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

Remove: 15 - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

Remove: 29 - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
0 голосов
/ 29 мая 2020
    int[] array={1,2,3,4,5,6};
    int removelength=2;
    int e=1;
    while(e<=removelength) {
        for(int i=1;i<array.length;i++)
        array[array.length-i]=array[array.length-i-1];
        e++;
    }

    for(int i=0;i<removelength;i++) {
        array[i]=0;
    }
    for(int g:array)
    {
      System.out.print(g);
    }
0 голосов
/ 29 мая 2020

Вы можете попробовать это:

public static void shift_histInfo(long m)
{
    int[] myIntArray = {50,21,1,45,901};
    int[] myIntArray2 = {50,21,1,45,901};

    for (int j=0 ;j< myIntArray.length ; j++){
        int temp = (int) (j+m);
        if (temp >= myIntArray.length){
            temp = temp - myIntArray.length;
            myIntArray2[temp] = 0;
        } else {
            myIntArray2[temp] = myIntArray[j];
        }

    }
    for (int j=0 ;j< myIntArray2.length ; j++){
        System.out.println(myIntArray2[j]);
    }

}

Вывод:

при shift_histInfo(2),

[0,0,50,21,1]
...