我正在尝试编写一个代码来获取从(0,0)开始的猴子可以访问的点集(x,y),这样每个点都满足| x | + | y | < _limitSum。我编写了下面的代码,并使用了Coordinate类型的成员的静态HashSet(此处未显示),并编写了一个递归方法AccessPositiveQuadrantCoordinates。但问题是通过递归调用传递的HashSet成员不会反映先前调用中添加的Coordinate成员。任何人都可以帮助我如何传递对象引用来实现这一点吗?还有其他方法可以解决这个问题吗?
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 :(得分:2)
但问题是通过递归调用传递的HashSet成员没有反映先前调用中添加的Coordinate成员。
我认为这不太可能。我认为您的Coordinate
类更有可能不会恰当地覆盖equals
和hashCode
,这就是该集合无法“找到”值的原因。
顺便说一句,使用这样的静态变量对我来说似乎是一个非常糟糕的主意 - 为什么不在GetAccessibleCoordinateCount()
中创建集合并将引用传递给AccessPositiveQuadrantCoordinates
,这可以反过来继续在递归调用中传递它吗?
(另外,我强烈建议你开始遵循Java命名约定......)
答案 1 :(得分:1)
我认为使字段_accessibleCoordinates
非静态
并且您应该知道HashSet每次都不保证相同的迭代顺序,您最好为此目的使用LinkedList ...
关于通过引用传递,我发现这篇文章非常有用
java - pass by value - SO link
根据您的操作,您将在每次递归调用中正确更新_accessibleCoordinates。