私は凸包上の点の集合を返すために必要のあるJarvisの行進(ラッピング)プログラムを、やっています。私は、例えば、[L0、L1、L2]、正しいポイントを取得していますが、[ "L1"、 "L2"、 "L3"]である必要があります。
私の最終的な結果を交換するまでセットに結果を追加し、私が使用している「\」「+ temp.point + 『\』」とも「「」+ temp.point +「」」が、それらの両方が終了するとき。
public static Set<String> getBoundary (String sectorFile){
Set<String> points = new HashSet<>();
public static Set<String> getBoundary(String sectorFile){
Set<String> points=new HashSet<>();
Set<Point> vals=new HashSet<>();
Vector<Point> hull=new Vector<Point>();
try(Scanner s=new Scanner(new File(sectorFile))){
s.useDelimiter("[\\\\|\\n\\r]+");
while(s.hasNext()){
String point=s.next();
double x=s.nextDouble();
double y=s.nextDouble();
Point xy=new Point(point,x,y);
xy.setPoint(point);
xy.setX(x);
xy.setY(y);
vals.add(xy);
}
Point[]values=new Point[vals.size()];
vals.toArray(values);
int l=0;
for(int i=1;i<vals.size();i++)
if(values[i].x<values[l].x)
l=i;
// Start from leftmost point, keep moving
// counterclockwise until reach the start point
int p=l,q;
do
{
// Add current point to result
hull.add(values[p]);
q=(p+1)%vals.size();
for(int i=0;i<vals.size();i++)
{
if(orientation(values[p],values[i],values[q])==2)
q=i;
}
p=q;
}while(p!=l); // While we don't come to first
// point
for(Point temp:hull)
points.add(temp.point);
}catch(FileNotFoundException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
return points;
}
private static class Point
{
String point;
double x, y;
Point(String point, double x, double y){
this.point = point;
this.x=x;
this.y=y;
}
private void setPoint(String i) {
this.point = i;
}
private void setX (double x) {
this.x = x;
}
private void setY (double y) {
this.y = y;
}
}
予想
["L0", "L1", "L2"]
実際の
["L2", "L1", "L0"]
ビッグ誤解:セットがないではない順序を持っています。あなたはあなたと同じ「順番」の要素与えることHashSetのに頼ることができないすべてのを。
すべての場合は、LinkedHashSetのを(あなたがあなたの要素を受け取り使用することができ、挿入順)。他の代替は、暗黙的に行いTreeSetのだろうソートすべての要素のを。これら二つのオプションは、あなたの要件のために動作しない場合は、代わりに、完全に別のコンテナ構造を使用することを検討すべきです。
また、注意してください:合理的にHashSetの内のオブジェクトを使用するために、そのクラスが@Override必要がありますequals()
し、hashCode()
(参照ここでは例えば)。あなたのポイントクラスにはありません、それは遅かれ早かれ、非常に予期しない動作につながります!
最後に:(集合論のように:彼らは、同一のコンテンツ、または交差点、あるいは全く交差点を持っています)もちろん、あなたが二組を持っているとき、あなたはそれらを比較することができます。そして、あなたのPointクラスは、合理的な持っていると仮定してequals()
何をしたい、おそらくある方法で、2つのセットはまったく同じポイントが含まれていることを比較するために。