我有一项任务,需要为集合中的每个对象生成唯一值。如果哈希码合约中不允许冲突,那么使用哈希码将是完美的。
一个想法:将每个对象的哈希码记录到一个多重集中。然后,使用哈希码作为唯一标识符,但如果该哈希码不止一次在集合中,则使用也不在集合中的不同值。但这感觉笨重和尴尬。
更好的想法?
这是我已经拥有的:
public static <V> void toGraphViz(final Graph<V, DefaultWeightedEdge> g, String filename) {
// to avoid hashcode collisions
final Set<Integer> hashcodes = new HashSet<Integer>(g.vertexSet().size());
DOTExporter<V, DefaultWeightedEdge> dot = new DOTExporter<V, DefaultWeightedEdge>(new VertexNameProvider<V> () {
// vertex name must be unqiue
@Override
public String getVertexName(V arg0) {
int hash = arg0.hashCode();
while (hashcodes.contains((hash))) {
hash += 1;
}
return "" + hash;
}
}
编辑:我想这最初并不清楚,但是 id 编号确实需要成为对象的函数,因为getVertexName(V)
会被多次调用,并且它期望对于相同的值V
,它会得到相同的结果。
此外,Vertex 类型是通用的。所以我不能对特定的类进行任何修改来解决这个问题。