Помогите исправить ошибку в задании

168
23 января 2019, 20:50

Помогите с данной ошибкой пожалуйста.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
        at lab.DoubleArray.addPoint(DoubleArray.java:38)
        at lab.AbstractArrayOfPoints.test(AbstractArrayOfPoints.java:45)
        at lab.DoubleArray.main(DoubleArray.java:55)
    C:\Users\apolo\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
    СБОРКА ЗАВЕРШЕНА СО СБОЕМ (общее время: 0 секунд)
AbstractArrayOfPoints.class
    public abstract class AbstractArrayOfPoints {
    public abstract void setPoint(int i, double x, double y);
    public abstract double getX(int i);
    public abstract double getY(int i);
    public abstract int count();
    public abstract void addPoint(double x, double y);
    public abstract void removeLast();
    public void sortByX() {
        boolean mustSort; 
        do {
            mustSort = false;
            for (int i = 0; i < count() - 1; i++) {
                if (getX(i) > getX(i + 1)) {
                    double x = getX(i);
                    double y = getY(i);
                    setPoint(i, getX(i + 1), getY(i + 1));
                    setPoint(i + 1, x, y);
                    mustSort = true;
                }
            }
        }
        while (mustSort);
    }
    @Override
    public String toString() {
        String s = "";
        for (int i = 0; i < count(); i++) {
            s += "x = " + getX(i) + " \ty = " + getY(i) + "\n";
        }
        return s + "\n";
    }
    public void test() {
        addPoint(22, 45);
        addPoint(4, 11);
        addPoint(30, 5.5);
        addPoint(-2, 48);
        sortByX();
        System.out.println(this);
    }
}
DoubleArray.class
public class DoubleArray extends AbstractArrayOfPoints{
    private double[][] array = {{ },{ }};
    @Override
    public void setPoint(int i, double x, double y) {
        if(i < count()){
            array[i][i] = x;
            array[i][i+1] = y;
        }
    }
    @Override
    public double getX(int i) {
        return array[i][i];
    }
    @Override
    public double getY(int i) {
        return array[i][i+1];
    }
    @Override
    public int count() {
        return array.length;
    }
    @Override
    public void addPoint(double x, double y) {
        double[][] axy = new double[array.length + 1][array.length];
        System.arraycopy(array, 0, axy, 0, array.length);
        for (int i = 0; i < axy.length; i++){
            for(int j = 0; j < axy[i].length; j++){
                axy[i][j] = x;
                axy[i][j+1] = y;
            }
        }
        array = axy;
    }
    @Override
    public void removeLast() {
        if (count() == 0) {
            return;
        }
        double[][] axy = new double[array.length - 1][array.length - 2];
        System.arraycopy(array, 0, axy, 0, axy.length);
        array = axy;
    }
    public static void main(String[] args) {
        new DoubleArray().test();
    }
}
UPD.
run:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at lab.DoubleArray.getX(DoubleArray.java:17)
    at lab.AbstractArrayOfPoints.sortByX(AbstractArrayOfPoints.java:23)
    at lab.AbstractArrayOfPoints.test(AbstractArrayOfPoints.java:49)
    at lab.DoubleArray.main(DoubleArray.java:54)
C:\Users\apolo\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
СБОРКА ЗАВЕРШЕНА СО СБОЕМ (общее время: 0 секунд)
AbstractArrayOfPoints.class
package lab;
public abstract class AbstractArrayOfPoints {
    public abstract void setPoint(int i, double x, double y);
    public abstract double getX(int i);
    public abstract double getY(int i);
    public abstract int count();
    public abstract void addPoint(double x, double y);
    public abstract void removeLast();
    public void sortByX() {
        boolean mustSort; 
        do {
            mustSort = false;
            for (int i = 0; i < count() - 1; i++) {
                if (getX(i) > getX(i + 1)) {
                    double x = getX(i);
                    double y = getY(i);
                    setPoint(i, getX(i + 1), getY(i + 1));
                    setPoint(i + 1, x, y);
                    mustSort = true;
                }
            }
        }
        while (mustSort);
    }
    @Override
    public String toString() {
        String s = "";
        for (int i = 0; i < count(); i++) {
            s += "x = " + getX(i) + " \ty = " + getY(i) + "\n";
        }
        return s + "\n";
    }
    public void test() {
        addPoint(22, 45);
        addPoint(4, 11);
        addPoint(30, 5.5);
        addPoint(-2, 48);
        sortByX();
        System.out.println(this);
        }
    }
DoubleArray.class
package lab;
public class DoubleArray extends AbstractArrayOfPoints {
    private double[][] array = {{}, {}};
    @Override
    public void setPoint(int i, double x, double y) {
        if (i < count()) {
            array[i][0] = x;
            array[i][1] = y;
        }
    }
    @Override
    public double getX(int i) {
        return array[i][0];
    }
    @Override
    public double getY(int i) {
        return array[i][1];
    }
    @Override
    public int count() {
        return array.length;
    }
    @Override
    public void addPoint(double x, double y) {
        final int len = array.length;
        double[][] axy = new double[len + 1][len];
        System.arraycopy(array, 0, axy, 0, len);
        axy[len][0] = x;
        axy[len][1] = y;
        array = axy;
    }
    @Override
    public void removeLast() {
        if (count() == 0) {
            return;
        }
        double[][] axy = new double[array.length - 1][array.length];
        System.arraycopy(array, 0, axy, 0, axy.length);
        array = axy;
    }
    public static void main(String[] args) {
        new DoubleArray().test();
    }
}
Answer 1

Думаю, реализация addPoint должна была быть такой:

@Override
public void addPoint(double x, double y) {
    final int len = array.length;
    double[][] axy = new double[len + 1][len];
    System.arraycopy(array, 0, axy, 0, len);
    axy[len][0] = x;
    axy[len][1] = y;
    array = axy;
}

UPD.

Заметил, что похожая ошибка работы с x и y есть и в других метода:

@Override
public double getX(int i) {
    return array[i][0];
}
@Override
public double getY(int i) {
    return array[i][1];
}

PS. а почему бы вместо массивов не использовать ArrayList?

READ ALSO
Как добавить jar библиотеку к проекту вручную?

Как добавить jar библиотеку к проекту вручную?

У меня есть jar библиотека и файл Mainjava

163
Поиск подматрицы в матрице

Поиск подматрицы в матрице

Есть задача поиска в матрице нужную подматрицу, пример на фото

233
Android: ExpandableListView сделать пробел между gruops

Android: ExpandableListView сделать пробел между gruops

Cделать расстояние между группамми элементов по типу android:dividerHeight в обычном listview?

200
передача данных по ble

передача данных по ble

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

180