2012-03-19 85 views
0

我想写一个代码来获得从(0,0)开始的猴子可访问的点集(x,y),使得每个点满足| x | + | y | < _limitSum。我写了下面的代码,并使用了坐标类型(此处未显示)的成员的静态HashSet,并编写了递归方法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 2012-03-19 09:09:13

+0

@EJP:好的。但是如果我们需要一组点来代替Count,那么非静态变量如何能够达到目的呢?你能简要介绍一下吗? – somnathchakrabarti 2012-03-19 09:29:21

+0

使用实例变量。如果你的方法是静态的,你只需要静态变量。他们不是。 – EJP 2012-03-19 09:30:48

回答

1

我看不出有任何问题,使得现场_accessibleCoordinates非静态

,你应该知道的HashSet并不保证相同的迭代顺序每次,你可以更好地使用一个LinkedList为目的...

和有关按引用传递,我发现这个职位是非常有用的

java - pass by value - SO link

从你在做什么你会在每次递归调用正确更新_accessibleCoordinates。

+0

是的,您是对的。但是我打印HashSet中的所有元素并且迭代顺序是否太重要?您能否介绍一下非静态字段如何工作?你可以假设我们需要的是所有点的集合,而不仅仅是Count。 – somnathchakrabarti 2012-03-19 09:27:57

2

但问题是整个递归调用通过HashSet的成员不反映协调会员在以前的调用增加。

我认为这是不太可能的。我认为您的Coordinate课程更有可能不会覆盖equalshashCode,这就是为什么该设置无法“查找”这些值。另外,使用这样的静态变量对我来说似乎是一个非常糟糕的主意 - 为什么不创建GetAccessibleCoordinateCount()中的集合并将引用传递给AccessPositiveQuadrantCoordinates,而该参考又可以继续在递归中传递给它电话?

(如另一个不谈,我会强烈建议你开始下面的Java命名约定...)

+0

谢谢。但即使我将HashSet添加到GetAccessibleCoordinateCount()中,我仍然必须传递HashSet _accessibleCoordinates作为参考。在Java中传递对象作为参考的方式是什么? – somnathchakrabarti 2012-03-19 09:21:34

+0

@somnathchakrabarti:Java中表达式的值总是*引用或原始值。你永远不能传递*实际对象*。你不能通过* reference来传递参数,但是如果你通过值传递一个引用类型变量,那么你总是传递一个引用 - 所以对这个对象的任何修改对于调用者都是可见的。 (修改参数变量本身,例如使其引用另一个对象,*不会影响参数。) – 2012-03-19 09:23:55

相关问题