2012-12-21 19 views
7

Java'da çalışırken, üzerinde çalıştığım bir çizim işlevini (çokgen oluşturucu) basitleştirmek istiyordum. Bir çokgen oluşturmak Genellikle,, bunu:Değişken miktardaki argümanlarla Java yöntemini basitleştirme

Polygon mypoly = new Polygon(); 
mypoly.addPoint(x1, y1); 
mypoly.addPoint(x2, y2); 
mypoly.addPoint(x3, y3); 
Draw.fillPolygon(g, mypoly, Color.blue); 

otomatik olarak Koordinatları vermek için bir görüntü eşleştiricisi kullanmak istiyorum, bu yüzden kendi fonksiyonuna yapıştırın kopyalayıp sadece olabilir.

myCommand(x1, y1, x2, y2, x3, y3); 

Bunların her biri, üstteki çokgen komutuna gider. Benim karşı karşıya olduğum problem, benim polimom oluşturulduğunda, kaç noktanın ekleneceğini ve nereye yerleştirileceğini nasıl bilecek?

myCommand, argüman ekledikçe noktaları otomatik olarak eklemek için ve her noktayı özgün çokgen oluşturma yönteminin x, y ile karşılık gelmesini sağlamaya çalışıyorum.

+1

kullanın [varargs] (http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html) . –

cevap

7

builder modelini kullanmanız gerektiği gibi görünüyor. pseudocode:

PolygonBuilder pb = new PolygonBuilder(); 
pb.addPoint(1,1); 
pb.addPoint(1,2); 
// etc... 

Polygon p = pb.newPolygon(); 

böylece fikir noktaları kümesi ile oluşturucu sağlamalarıdır ve size uygun poligon oluştururuz. Yapıcılar genellikle fluent interface ile tasarlanmıştır. Oluşturucunun bir fabrika gibi davranabileceğini ve Polygon'un uygun alt sınıflarını (dilerseniz, kare, üçgen, pentagle vb.) Iade edebileceğini unutmayın.

Bunun yerine, Java varargs mechanism kullanarak değişken sayıda argüman alan bir yöntem sağlayabileceğinizi unutmayın. Örneğin.

public void addPoints(Integer... args) { 
    // and iterate here 
} 

için bir x tanımlamak için bir Point nesne oluşturmak isteyen ve/Y birlikte hareket. Aksi takdirde, yukarıda sayısız argüman olup olmadığını kontrol etmek zorunda kalacak ve bu argümanlar birbirine bağlı olmayacaktır.

5

Sen varargs kullanabilir ve xs dizileri ve ys

alır constructor kullanarak çokgen dinamik oluşturabilir

public Polygon createPolygon(int... points) { 
    if (0 != points.length % 2) { 
     throw new IllegalArgumentException("Must have even number of points"); 
    } 

    int numOfPoints = points.length/2; 
    int xs = new int[numOfPoints]; 
    int ys = new int[numOfPoints]; 
    for (int i=0; i < numOfPoints;i++) { 
     xs[i] = points[i*2]; 
     yx[i] = points[i*2 + 1]; 
    } 

    return new Polygon(xs, ys, numOfPOints); 
} 

Sonra herhangi bir sayı ile yöntemi çağırabilirsiniz (Kod test edilmedi) işaret

Polygon p = createPolygon(x1,y1,x2,y2,x3,y3);

+0

+1 Bu sayfadaki cevapların hepsi teknik olarak doğru ancak bu birinciyim, çünkü sadece * * varargs'dan (en iyi cevap) bahseder ve işleri trivia ile karıştırmaz. – Asaph

+2

for döngüsü, 'i ++ 'yerine (int i = 0; i BalusC

+0

ve xs ve ys için dizin ne olurdu? –

1

sana bir varar alınan bir yöntem kullanmak düşünüyorum gs

(...)

Her nokta için bir sarıcı gerekir:

class Point { 
    int x; 
    int y; 
    Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

yöntem olabilir:

myCommand(Point ... points) 
çağrı

myCommand(new Point(0,0), new Point(1,1), new Point(0,1)); 

için

Ve beraberlik için:

Polygon mypoly = new Polygon(); 
for(Point p : points) 
    mypoly.addPoint(p.x,p.y); 
Draw.fillPolygon(g,mypoly,Color.blue); 
+0

['java.awt.Point'] (http://docs.oracle.com/javase/6/docs/api/java/awt/Point.html) zaten var (1.0'dan beri). Tekerleği yeniden icat etmeye gerek yok. – Asaph

+0

Haklısınız. –

2

Brian Agnew'un yanıtını genişletmek için addPoints yönteminin alabileceği bir Point sınıfı eklemenin de yararı olabilir. Çokgenliğinizden puan eklemek/kaldırmak için biraz daha kolay olabilir.

public final class Point<X,Y>{ 
    private final X x; 
    private final Y y; 

    public Point(X x, Y y){ 
     this.x=x; 
     this.y=y; 
    } 

    public X getX(){return x;} 

    public Y getY(){return y;} 
} 

O zaman olabilir:

public void addPoints(Point<Integer,Integer>... points){ 
    for(Point<Integer,Integer> point:points) 
     //your logic 
} 
+0

['java.awt.Point'] (http://docs.oracle.com/javase/6/docs/api/java/awt/Point.html) zaten var (1.0'dan beri). Tekerleği yeniden icat etmeye gerek yok. – Asaph

+0

Genellikle katılıyorum, ancak bu durumda bir değişmez nokta sınıfının kullanılması biraz mantıklıdır ve bu kod, jenerik kullanması nedeniyle diğer birçok uygulamada yeniden kullanılabilir. –

+0

Belki de onu ayırt etmek ve kodu amacı daha iyi tanımlamak için 'ImmutablePoint' sınıfını adlandırın? – Asaph

İlgili konular