объединение двух списков - PullRequest
0 голосов
/ 27 ноября 2010

Привет, у меня действительно проблема с объединением двух списков в таком коде, как mergesort. Вот мой код, и он выдаст исключение, но я не знаю почему!для строки: System.out.println(auxiliaryList.get(mid)); исключение:

X :166.0  Y: 104.0angle0.0
X :166.0  Y: 104.0angle0.0
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 2, Size: 1
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.get(ArrayList.java:322)
    at ConvexHull.DCHullVersion.mergeForUpperHull(DCHullVersion.java:142)
    at ConvexHull.DCHullVersion.dcHullForUpperHull(DCHullVersion.java:126)
    at ConvexHull.DCHullVersion.dcHullForUpperHull(DCHullVersion.java:122)

Ответы [ 3 ]

1 голос
/ 27 ноября 2010
for (int i = mid + 1; i <= high; i++) {
    auxiliaryListTow.add(upperHull.get(i));
}

Полагаю, эта строка вызывает исключение? Попробуйте изменить i <= high to i <high ​​</p>

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

В Java массивы начинаются с индекса 0.

ура

0 голосов
/ 27 ноября 2010

Причина, по которой вы получаете исключение IndexOutOfBoundsException, заключается в том, что вы создаете совершенно новый List<Point> auxiliaryList каждый раз, когда вызывается mergeForUpperHull. Таким образом, в сценарии, где low = mid = 2, вы будете вставлять (добавлять) только один элемент в новый дополнительный список, который не будет соответствовать среднему индексу, который вы пытаетесь получить из дополнительного списка в системе.

Есть другие проблемы с кодом, но я предполагаю, что вы просто находитесь в режиме блокнота. Но чтобы дать вам верное направление, я бы не использовал два вспомогательных списка в методе слияния, вместо этого я буду использовать основной список для выполнения операций сравнения и обмена. Помните, что если вы просто добавите во вспомогательный список для каждой операции слияния, у вас будет больше данных в окончательном списке в результате всплытия из-за рекурсивных вызовов dcHullForUpperHull.

Если быть более точным, в результате вы получите (Log2(size of list)+1)*(size of list) элементов из выполняемого слияния (при условии, что вы не создаете новый список каждый раз)

Алгоритмы «разделяй и властвуй» - отличные учебные упражнения, поэтому я не буду здесь выкладывать полный код, но вышеприведенное должно быть подходящим для вас способом завершить вышеупомянутую сортировку слиянием

0 голосов
/ 27 ноября 2010

Если я не ошибаюсь, если список имеет размер, скажем, 3 или более элементов, то в какой-то момент будет вызван метод

private void mergeForUpperHull(int low, int mid, int high)

с минимальным значением Параметры 1005 * и mid , имеющие одинаковое значение, выше 0 .Это определенно вызовет исключение, с которым вы сталкиваетесь, когда пытаетесь сделать это System.out.println(auxiliaryList.get(mid));
Попробуйте отладить свой код, построчно, это может помочь вам.
Я просто любопытен, почему вы это делаете?Ваш отрывок кода оставляет много, чтобы быть угаданным и, честно говоря, это не имеет особого смысла (по крайней мере, не для меня).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...