|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
shoo : 115 Новичок
|
Янв 30, 2012 13:41 |
|
|
Добрый день. Каким простым способом можно использовать указатели в Java?
Вот такое дело. Есть какой-то элемент:
| Код: |
| Class position = root; |
Затем, например:
| Код: |
if (position == null) {
position = added;
} |
Нужно, чтобы данный код делал root = added. Кажется, в Си это называется указателями. |
|
|
|
 |
мсье клоц : 562 Постоянный посетитель
|
Янв 30, 2012 13:51 |
|
|
| shoo писал(а): |
Добрый день. Каким простым способом можно использовать указатели в Java?
Нужно, чтобы данный код делал root = added. Кажется, в Си это называется указателями. |
В смысле, чтобы ячейка памяти, содержащая root, стала added?
Вряд ли этого можно добиться базовыми средствами. |
|
|
|
 |
shoo : 115 Новичок
|
Янв 30, 2012 14:01 |
|
|
| Цитата: |
| В смысле, чтобы ячейка памяти, содержащая root стала added? |
Ага, именно так.
Ну.. Может всё-таки можно как-то исхитриться? Есть, конечно, и другой метод реализации, но он на самый крайний случай. |
|
|
|
 |
rfq : 218 Новичок
|
Янв 30, 2012 14:09 |
|
|
| shoo писал(а): |
| Ну.. Может всё-таки можно как-то исхитриться? |
Можно. Перепроектировав программу, чтобы такого изврата не требовалось. |
|
|
|
 |
Skynin : 656 Постоянный посетитель
|
Янв 30, 2012 14:32 |
|
|
Здесь указатели не нужны и на Си.
За использование указателей для изменения глобальных переменных и на Си бьют по пальцам.
| Код: |
Class position = getRoot(added);
// ---
Class root;
Class getRoot(Class pDefault) {
if (root == null) root = pDefault;
return root;
}
|
Обработку ситуации когда и default == null напишите сами. |
|
|
|
 |
shoo : 115 Новичок
|
Янв 30, 2012 15:44 |
|
|
| Skynin писал(а): |
Здесь указатели не нужны и на Си.
За использование указателей для изменения глобальных переменных и на Си бьют по пальцам.
| Код: |
Class position = getRoot(added);
// ---
Class root;
Class getRoot(Class default) {
if (root == null) root = default;
return root;
}
|
Обработку ситуации когда и default == null напишите сами. |
Не знаю, возможно я что-то не так понял, но, кажется, это не то. У меня не храниться в экземляре класса ни корень, ни предок. У меня вот такая проблема:
Есть класс
| Код: |
class Thing {
int num;
Thing left, right;
} |
И есть экземпляр класса - root. Нужно организовать вставку элементов из файла в бинарное дерево, по условию меньшее слева, большее справа. Если добавляемое значение больше корня, то корень меняется на добавляемое, а предыдущее значение корня ставиться слева.
Проблема в том, что интерфейс добавляющего метода позволяет передавать только добавляемое значение. root в него не передать, а значит рекурсия не получится. По моему, это можно сделать при помощи указателей и бесконечного цикла, хотя я не уверен. |
|
|
|
 |
мсье клоц : 562 Постоянный посетитель
|
Янв 30, 2012 16:08 |
|
|
| shoo писал(а): |
И есть экземпляр класса - root. Нужно организовать вставку элементов из файла в бинарное дерево, по условию меньшее слева, большее справа. Если добавляемое значение больше корня, то корень меняется на добавляемое, а предыдущее значение корня ставиться слева.
Проблема в том, что интерфейс добавляющего метода позволяет передавать только добавляемое значение. root в него не передать, а значит рекурсия не получится. По моему, это можно сделать при помощи указателей и бесконечного цикла, хотя я не уверен. |
Сейчас лежу с температурой, так что мог чего-то недопонять или упустить, но Вы уверены, что выбрали оптимальный алгоритм для бинарного дерева?
И ещё один момент.
| Цитата: |
| по условию меньшее слева, большее справа. Если добавляемое значение больше корня, то корень меняется на добавляемое, а предыдущее значение корня ставиться слева. |
Как понимать это, что тогда справа? |
|
|
|
 |
rfq : 218 Новичок
|
Янв 30, 2012 16:12 |
|
|
| shoo писал(а): |
Есть класс
| Код: |
class Thing {
int num;
Thing left, right;
} |
И есть экземпляр класса - root. |
А в самом начале, когда дерево пусто, root чему равно? По идее, null. Потому что, если не null, то уже есть какой-то num, но какой? Ведь еще ничего не вставляли, значит, num неправильный.
Но обращаться со вставкой к чему-то надо? Вот и нужен объект типа
| Код: |
class Tree {
Thing root;
void insert(int num) {
if (root==null) {
root=new Thing(num);
} else {
root=root.insert(num);
}
}
}
|
|
|
|
|
 |
shoo : 115 Новичок
|
Янв 30, 2012 16:22 |
|
|
| мсье клоц писал(а): |
Сейчас лежу с температурой, так что мог чего-то недопонять или упустить, но Вы уверены, что выбрали оптимальный алгоритм для бинарного дерева?
И ещё один момент.
| Цитата: |
| по условию меньшее слева, большее справа. Если добавляемое значение больше корня, то корень меняется на добавляемое, а предыдущее значение корня ставиться слева. |
Как понимать это, что тогда справа? |
Нет. Я думаю, что это вообще непонятно для чего нужный алгоритм создания бинарного дерева. Российская учёба, бессмысленная и беспощадная. Вообще, я вычислял алгоритм исходя из примера работы, так что не совсем уверен, правильный ли он, но пока это единственное, что подходит под данный пример. Из условий говорится, что метод insert добавляет значения в дерево, если его там нет, если есть, то вызов исключения, а если нет, то "его надо добавить в дерево(сортировать по номерам)". Больше, кроме наследования от BinaryTree ничего нет. Такие дела.
Правое значение затем может добавиться. Допустим, корень 41, левое дерево 39, пришло из файла значение 40, значит пришедшее из файла отправляется направо, т.к. больше левого.
Поправляйтесь. |
|
|
|
 |
shoo : 115 Новичок
|
Янв 30, 2012 16:34 |
|
|
| Код: |
А в самом начале, когда дерево пусто, root чему равно? По идее, null. Потому что, если не null, то уже есть какой-то num, но какой? Ведь еще ничего не вставляли, значит, num неправильный.
Но обращаться со вставкой к чему-то надо? Вот и нужен объект типа
Код:
01 class Tree {
02 Thing root;
03 void insert(int num) {
04 if (root==null) {
05 root=new Thing(num);
06 } else {
07 root=root.insert(num);
08 }
09 }
10 } |
Ну, перед чтением из файла, дерево, по условию, обнуляется, я делаю это при помощи root = null.
Если я не ошибаюсь, у вас тут в методе получится бесконечная вставка уже во втором вызове, чтобы перемещаться по дереву рекурсией, нужно передавать в метод вставки root. Так я и буду делать, если не решу, как сделать иначе, не ломая интерфейса. |
|
|
|
 |
мсье клоц : 562 Постоянный посетитель
|
Янв 30, 2012 17:03 |
|
|
Сказать по правде, я ничего не понял. Даже наоборот, я ещё больше запутался.
Однако, чтобы кровь в мозгах не застаивалась, я решил прикинуть решение. Только было я решил это сделать, как всплыла одна незначительная проблема:
1)
| Цитата: |
| по условию меньшее слева, большее справа. Если добавляемое значение больше корня, то корень меняется на добавляемое, а предыдущее значение корня ставиться слева. |
2)
| Цитата: |
| Правое значение затем может добавиться. Допустим, корень 41, левое дерево 39, пришло из файла значение 40, значит пришедшее из файла отправляется направо, т.к. больше левого. |
И возвращаемся мы к пункту "1", т.к. первый элемент (root.left) левого дерева является корнем для этой части дерева.
В общем, я не могу не задать этот вопрос: Вы уверены, что правильно поняли задание?
Последний раз редактировалось: мсье клоц (Янв 30, 2012 17:06), всего редактировалось 2 раз(а) |
|
|
|
 |
Skynin : 656 Постоянный посетитель
|
Янв 30, 2012 17:03 |
|
|
|
|
|
|
 |
rfq : 218 Новичок
|
Янв 30, 2012 18:17 |
|
|
| shoo писал(а): |
| Нужно организовать вставку элементов из файла в бинарное дерево, по условию меньшее слева, большее справа. |
Какой инвариант следует поддерживать? Казалось бы,
max(left)<num<min(right).
Чтобы, сравнив с num, сразу понять, вставлять в левое или правое поддерево.
Но у вас:
| shoo писал(а): |
Если добавляемое значение больше корня, то корень меняется на добавляемое, а предыдущее значение корня ставиться слева.
|
В результате корень будет всегда root.num=max(tree), и следовательно, у всех Things right==null.
Вы уж определитсь, чего хотите, тогда может быть, и root менять не придется. |
|
|
|
 |
|
|
Страница 1 из 1
|
Список форумов
-> Основы языка Java |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|