为了好玩,我正在编写一个简单的物理系统,但遇到了一个让我陷入困境的问题。
现在的基本算法是:
我有一个移动的物体向两个静止的、无质量的物体移动。

移动物体一步平移,与其中一个物体发生碰撞。

我的回应是找到我可以移动的最小距离,以便它们不再发生碰撞。在这种情况下,这意味着将动态物体直接向下移动。但是,现在它正在与另一个盒子发生碰撞。

我对那个盒子重复同样的事情,试图移动动态盒子,使其不再发生碰撞,但这会将它推回到第一个盒子中。这将永远重复。我的算法从根本上有缺陷吗?
我有一个看起来像这样的类:
public class Node {
private final Node otherNode;
public Node(Node otherNode) {
this.otherNode = otherNode;
}
}
Run Code Online (Sandbox Code Playgroud)
并希望做类似的事情
Node n1, n2 ;
n1 = new Node(n2);
n2 = new Node(n1);
Run Code Online (Sandbox Code Playgroud)
但显然不能,因为n2尚未初始化.我不想使用setter来设置otherNode,因为它是最终的,因此只能设置一次.实现这一目标的最简洁方法是什么?是否有一些我不熟悉的Java语法让我这样做?我应该使用除了构造函数之外的初始化方法(丑陋),还是只使用一个setter(也很难看)?
我有一个电子邮件地址列表,格式如下:
name###@email.com
但这个数字并不总是存在.例如:john45 @ email.com,bob @email.com joe2@email.com等.我想用数字对这些名字进行排序,没有数字的那些名字先排序.我想出了一些有用的东西,但对Python来说是新手,我很好奇是否有更好的方法.这是我的解决方案:
import re
def sortKey(name):
m = re.search(r'(\d+)@', name)
return int(m.expand(r'\1')) if m is not None else 0
names = [ ... a list of emails ... ]
for name in sorted(names, key = sortKey):
print name
Run Code Online (Sandbox Code Playgroud)
这是我的脚本中唯一一次使用"sortKey",所以我更喜欢它是一个lambda函数,但我不知道该怎么做.我知道这会奏效:
for name in sorted(names, key = lambda n: int(re.search(r'(\d+)@', n).expand(r'\1')) if re.search(r'(\d+)@', n) is not None else 0):
print name
Run Code Online (Sandbox Code Playgroud)
但我认为我不应该两次调用re.search来做到这一点.在Python中执行此操作的最优雅方式是什么?