Yuxi Long Ответов: 2

Что плохого в этом методе?


Привет сообщество Codeproject,

Я работаю над проблемой, которая просит меня написать метод для вставки элемента element в массив arr на указателе index. Мой код прилагается ниже:

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

Expected result: 
{11, 10, 78, 59, 35, 46, 84, 84, 34, 90}

Your result: 
{11, 10, 78, 59, 35, 46, 84, 84, 34}


Спасибо

Что я уже пробовал:

public void add(int index, int element)
    {
        int tempArr[] = new int[arr.length + 1];

        for(int i = 0; i < index; i++)
        {
            tempArr[i] = arr[i];
        }
        tempArr[index] = element;
        for(int i = index; i < arr.length; i++)
        {
            tempArr[i + 1] = arr[i];
        }
        arr = tempArr;
    }


Полный исходный код:
<pre>public class ExpandingArray
{
    private static final int STARTING_SIZE = 10;
    private int[] arr;
    private int currentSize;
    private int numElements;
    
    public ExpandingArray()
    {
        arr = new int[STARTING_SIZE];
        currentSize = STARTING_SIZE;
        numElements = 0;
    }
    
    // Remove the element at index `index` and shift
    // all subsequent elements to the left. 
    public int remove(int index)
    {
        // your code here
        int tempArr[] = new int[currentSize - 1];
        for(int i = 0; i < index; i++)
        {
            tempArr[i] = arr[i];
        }
        for(int i = index + 1; i < currentSize; i++)
        {
            tempArr[i - 1] = arr[i];
        }
        currentSize--;
        arr = tempArr;
        return 0;
    }
    
    // Add the int `element` at the `index` in the array.
    // You'll need to shift everything one index to the right
    // after this index.
    public void add(int index, int element)
    {
        // your code here
        int tempArr[] = new int[arr.length + 1];

        for(int i = 0; i < index; i++)
        {
            tempArr[i] = arr[i];
            System.out.println(arr[i]);
        }
        tempArr[index] = element;
        System.out.println(tempArr[index]);
        for(int i = index; i < arr.length; i++)
        {
            tempArr[i + 1] = arr[i];
            System.out.println(arr[i]);
        }
        arr = tempArr;
    }
    
    // Return the number of elements in your array.
    public int size()
    {
        return currentSize;
    }
    
    private boolean isFull()
    {
        return numElements == currentSize;
    }
    
    private void expand()
    {
        System.out.println("Expanding");
        int newSize = currentSize * 2;
        int[] newArray = new int[newSize];
        
        // Copy over old elements
        for(int i = 0; i < currentSize; i++)
        {
            newArray[i] = arr[i];
        }
        
        currentSize = newSize;
        arr = newArray;
    }
    
    public int get(int index)
    {
        return arr[index];
    }
    
    public void add(int x)
    {
        if(isFull())
        {
            expand();
        }
        arr[numElements] = x;
        numElements++;
    }
    
    public String toString()
    {
        String str = "{";
        for (int i=0; i < numElements - 1; i++) {
            str += arr[i] + ", ";
        }
        if (str.length() > 0 && str.charAt(str.length()-2)==',') {
            str = str.substring(0, str.length()-2);
            str += "}";
        }
        return str;
    }
}

Richard MacCutchan

Я только что попробовал этот код, и он отлично работает. Пожалуйста, покажите свои результаты.

Yuxi Long

Привет,

Спасибо за помощь. Моя полная программа прилагается ниже. Спасибо!

Richard MacCutchan

Вы забыли увеличить currentSize В вашем add метод.

Mohibur Rashid

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

Yuxi Long

Привет,

Спасибо за помощь. Моя полная программа прилагается ниже. Спасибо!

2 Ответов

Рейтинг:
0

Mohibur Rashid

функция toString является неверным. Если прибытие имеет только один элемент, то функция будет выбрасывать

java.lang.StringIndexOutOfBoundsException: String index out of range: -1


вот как это должно быть;
если в массиве ничего нет то выведите
{}
если только один элемент, то печать
{элемент1}
если их несколько то распечатайте
{элемент1, элемент2}
Итак, предложенный алгоритм будет следующим
string := "{"
if element count is zero then
  string := concat(string, "}");
  return
end if

string := concat(string, arr[0]);
while ( item in array, skipping the first element ): do
  string := concat(string, ", ", item);
end while

string := concat(string, "}")

попробуйте свой исходный код


Рейтинг:
0

Patrice T

Почему вы печатаете все элементы, кроме последнего?

for (int i=0; i < numElements - 1; i++) {

Это также выглядит так, что все переменные не обновляются"d, Когда вы добавляете элемент.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.