2012-03-19 2 views
0

Я пытаюсь написать код, чтобы получить набор точек (x, y), доступных для обезьяны, начиная с (0,0), так что каждая точка удовлетворяет | x | + | y ​​| < _limitSum. Я написал приведенный ниже код и использовал статический HashSet членов типа Coordinate (не показано здесь) и написал рекурсивный метод AccessPositiveQuadrantCoordinates. Но проблема состоит в том, что члены HashSet, переданные через рекурсивные вызовы, не отражают членов Координатора, добавленных в предыдущие вызовы. Может ли кто-нибудь помочь мне в том, как передать ссылки на объекты, чтобы сделать это возможным? Есть ли другой способ решения этой проблемы?Как написать рекурсивную функцию с использованием статических переменных

public class MonkeyCoordinates { 
public static HashSet<Coordinate> _accessibleCoordinates = null; 
private int _limitSum; 
public MonkeyCoordinates(int limitSum) { 
    _limitSum = limitSum; 
    if (_accessibleCoordinates == null) 
     _accessibleCoordinates = new HashSet<Coordinate>(); 
} 
public int GetAccessibleCoordinateCount() { 
    _accessibleCoordinates.clear(); 
    Coordinate start = new Coordinate(0,0); 
    AccessPositiveQuadrantCoordinates(start); 
    return (_accessibleCoordinates.size() * 4); 
} 
private void AccessPositiveQuadrantCoordinates(Coordinate current) { 
    if (current.getCoordinateSum() > _limitSum) { return; } 
    System.out.println("debug: The set _accessibleCoordinates is "); 
    for (Coordinate c : _accessibleCoordinates) { 
     System.out.println("debug:" + c.getXValue() + " " + c.getYValue()); 
    } 

    if (!_accessibleCoordinates.contains(current)) { _accessibleCoordinates.add(current); } 
    AccessPositiveQuadrantCoordinates(current.Move(Coordinate.Direction.East)); 
    AccessPositiveQuadrantCoordinates(current.Move(Coordinate.Direction.North)); 
} 

Я дам указания всем приемлемым ответам.

Благодаря вперед, Сомнатх

+0

«Использование статических переменных» не имеет ничего общего с вашей проблемой. – EJP

+0

@EJP: Хорошо. Но если нам нужен набор точек вместо Count, то как нестатическая переменная может служить цели? Можете ли вы рассказать? – somnathchakrabarti

+0

Используйте переменную экземпляра. Вам нужны только статические переменные, если ваши методы статичны. Это не так. – EJP

ответ

1

я не вижу никаких проблем с созданием поля _accessibleCoordinates нестатической

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

и о проходе по ссылке, я нашел этот пост очень полезный

java - pass by value - SO link

От того, что вы делаете, вы будете правильно обновлять _accessibleCoordinates в каждом рекурсивном вызове.

+0

Да и правильно. Но я печатаю все элементы в HashSet и слишком ли имеет порядок итераций? Не могли бы вы рассказать о том, как нестатические поля будут работать?Вы можете предположить, что нам нужен набор всех точек, а не только граф. – somnathchakrabarti

2

Но проблема в том, что члены HashSet прошел через рекурсивные вызовы не отражают координату членов, добавленные в предыдущих вызовах.

Я думаю, что это очень маловероятно. Я думаю, что более вероятно, что ваш класс Coordinate не переопределяет equals и hashCode соответственно, поэтому набор не может «найти» значения.

Как и в сторону, используя статические переменные, как это кажется очень плохая идея для меня - почему бы вам не создать набор в GetAccessibleCoordinateCount() и передать ссылку на AccessPositiveQuadrantCoordinates, который в свою очередь может держать проходящей вниз в рекурсивной звонки?

(В другой стороне, я бы настоятельно рекомендую вам начать следующий Java именования ...)

+0

Спасибо. Но даже если я добавлю HashSet в GetAccessibleCoordinateCount(), мне все равно нужно передать HashSet _accessibleCoordinates в качестве ссылки. Каков способ передачи объекта в качестве ссылки в Java? – somnathchakrabarti

+0

@somnathchakrabarti: Значение выражения в Java всегда * является ссылкой или примитивным значением. Вы никогда не сможете передать * фактический объект *. Вы не можете передать аргумент * по * ссылке, но если вы передадите переменную ссылочного типа по значению, вы все равно передаете ссылку, поэтому любые изменения, внесенные в объект, будут видны вызывающему. (Модификация самой переменной параметра, например, ее обращение к другому объекту, * не повлияет на аргумент.) –

Смежные вопросы