Вставка в частично заполненный массив - PullRequest
0 голосов
/ 24 апреля 2020

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

Мой код:

import static java.lang.System.exit;
import static java.lang.System.out;
import java.util.Scanner;

public class ICA01_CC_PartB {

    final static Scanner cin = new Scanner(System.in);
    static int currentSize; // number of values actually in the intList
    static int[] intList;   // reference to the partially filled array storage

    public static void main(String[] args) {
        out.println("CPS 151 ICA 1 Part B");
        setup();
        printList(intList, "\nOriginal List");
        checkInsertion();
        out.println("\nGoodbye");
    } // end main

    private static void checkInsertion() {
        // check if there is room to insert
        if (currentSize >= intList.length) {
            terminate("List is full, cannot insert");
        }
        // Checking insertion
        int value = getInt("\nValue to insert: ");
        int position = getInt("At what index position? ");

        // check validity of position
        // TODO Put correct validation check
        if (position >= 0 && position <= currentSize) {
        shiftDown(position);
            intList[position] = value;
            currentSize++;
            printList(intList, "\nList after insertion");
        } else {
            out.println("Invalid insert position, no changes made");
        } // end if
    } // end method

    // move items from pos:currentSize-1 one position down (higher subscripts)
    private static void shiftDown(final int pos) {
      // TODO Write the code
      for(int i = (pos - 1); i >= 0 && i >= currentSize; i--){
             intList[i + 1] = intList[i];
          }
   } // end shiftDown

    // fills array with increasing values
    private static void fillArrayInc(final int startValue, final int howMany) {
        // Validity check 
        if (howMany < 0 || howMany > intList.length) {
            terminate("fillArrayInc: illegal argument, howMany = " + howMany);
        }

        for (int k = 0; k < howMany; k++) {
            intList[k] = startValue + k;
        }
        currentSize = howMany;
    } //end fillArrayInc

    // prints partially filled array with a legend
    private static void printList(final int[] arr, final String legend) {
        out.println(legend);
        out.print('[');
        // print first list item for a non-empty list
        if (currentSize > 0) {
            out.print(intList[0]);
        }
        // print rest of list items, comma separated
        for (int k = 1; k < currentSize; k++) {
            out.print(", " + arr[k]);
        }
        out.println(']');
    } // end printList

    private static void setup() {
        int maxSize, initSize;
        maxSize = getInt("Enter the maximum size: ");
        intList = new int[maxSize];
        initSize = getInt("Enter the starting size: ");
        if (initSize > maxSize) {
            terminate("starting size cannot be greater than maximum size");
        }
        fillArrayInc(100, initSize);
    } // end method

    private static int getInt(String prompt) {
        out.print(prompt);
        return cin.nextInt();
    } // end method

    private static void terminate(String message) {
        out.println("Error: " + message);
        exit(0);
    } // end terminate

} // end class

Вывод:

Выходное изображение

1 Ответ

0 голосов
/ 24 апреля 2020

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

private static void shiftDown(final int pos) {    
  for (int i = currentSize; i >= pos; i--) {
    intList[i+1] = intList[i];
  }
} // end shiftDown

Также есть пара незначительных неточностей, которые я заметил, ни одна из которых не приведет к сбою вашей программы, но может быть способом улучшить вашу оценку: (1 ) в процедуре printList вы передали массив arr, но затем для элемента [0] вы напрямую ссылаетесь на intList, вашу «глобальную» переменную. (2) вы, вероятно, получите больше стилевых точек для передачи длины в printList в качестве параметра, а не просто для прямой ссылки на currentSize. До вас, будет ли это исправлено, программа будет работать в любом случае. Я думаю, я говорю, что определенно лучше, чтобы ЛЮБОЕ передавалось и intList, и currentSize в качестве параметров, например (принимали их как arr и size), иначе не передавайте и не используйте напрямую intList и currentSize.

Надеюсь, это поможет!

...