【发布时间】:2011-07-22 23:16:35
【问题描述】:
我缺少针对特定问题的某种收集功能。
我想从有关问题背景的一些信息开始 - 也许有一种更优雅的方法来解决它,它不会以我遇到的具体问题结束:
我正在建模由四面体单元组成的体积网格(2D 模拟将是三角形网格)。如果两个四面体共享一个三角形面(占据三个顶点),则认为它们是相邻的。我的应用程序必须能够通过它们的共同面孔从一个单元格导航到另一个单元格。
为了满足其他一些要求,我不得不将面分成两个所谓的半面,它们共享相同的顶点但属于不同的单元格并且具有相反的方向。
应用程序需要能够进行这样的调用(Face 模拟半脸):
Cell getAdjacentCell(Cell cell, int faceIndex) {
Face face = cell.getFace(faceIndex);
Face partnerFace = face.getPartner();
if (partnerFace == null) return null; // no adjacent cell present
Cell adjacentCell = partnerFace.getCell();
return adjacentCell;
}
getPartner()-方法的实现是有问题的方法。我的做法如下:
Face-objects 可以创建某种不可变的Signature-object,其中仅包含顶点配置、方向(顺时针 (cw) 或逆时针 (ccw))和对原始对象的反向引用面对象。如果 Face.Signature-objects 占据相同的三个顶点,则认为它们是相等的 (@Override equals()) - 无论它们的方向和关联的单元格如何。
我在Mesh-objects 中创建了两个集合,以包含按方向分组的所有半面:
Set<Face.Signature> faceSignatureCcw = new HashSet<Face.Signature>();
Set<Face.Signature> faceSignatureCw = new HashSet<Face.Signature>();
现在我可以确定是否存在合作伙伴...
class Face {
public Face getPartner() {
if (this.getSignature().isCcw()) {
boolean partnerExists = this.getMesh().faceSignatureCw.contains(this);
} else {
boolean partnerExists = this.getMesh().faceSignatureCcw.contains(this);
}
}
}
...但是Set 不允许检索它包含的特定对象!它只是确认它包含一个通过.equals() 匹配的对象。
(背景信息结束)
我需要一个Collection-concept,它提供以下功能:
- 将
Face-Object 添加到集合中(应用程序禁止重复,因此不会发生) - 从集合中检索给定
Face-Object 的合作伙伴,该对象.equals()但具有相反的方向
一种可能的(但速度较慢的)解决方案是:
class PartnerCollection {
List<Face.Signature> faceSignatureCcw = new ArrayList<Face.Signature>();
List<Face.Signature> faceSignatureCw = new ArrayList<Face.Signature>();
void add(Face.Signature faceSignature) {
(faceSignature.isCcw() ? faceSignatureCw : faceSignatureCcw).add(faceSignature);
}
Face.Signature getPartner(Face.Signature faceSignature) {
List<Face.Signature> partnerList = faceSignature.isCcw() ? faceSignatureCw : faceSignatureCcw;
for (Face.Signature partnerSignature : partnerList) {
if (faceSignature.equals(partnerSignature)) return partnerSignature;
}
return null;
}
}
要完整:最终的应用程序必须在实时环境中处理数十万个Face-Objects。所以性能是一个问题。
在此先感谢任何至少尝试关注我的人 :) 我希望有人有正确的想法来解决这个问题。
【问题讨论】:
标签: java performance collections