Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Указатели в Java
Список форумов
 ->  Основы языка Java


 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
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 
Ответить с цитатой
shoo писал(а):

Нужно организовать вставку элементов из файла в бинарное дерево,

Спрашиваем у гугла
BTree Java
http://algs4.cs.princeton.edu/62btrees/BTree.java.html
А также много-много других ссылок.

Или
Двоичные деревья в Java
http://pda.javatalks.ru/sutra82453.php

А также много-много других ссылок.
К началу Посмотреть профиль Отправить личное сообщение
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


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru