2011-10-17 132 views
4

我有一個設計困境,我想與大家分享:我有一個具有代表一個人的各種成員變量的類。其中一個成員是座標中的人的家庭地點。這個類被保存在一個MySQL數據庫中。Java設計/面向對象設計問題

我遇到的問題是,我想擁有一個距離指定人物記錄距離的特定半徑範圍內的人員列表。

我成功地創建了一個SQL查詢,該查詢返回一個結果集,其中包含該人的詳細信息及其與針點的距離。但現在是問題:在Java中保存這些數據的最佳方式是什麼?保存人員類別成員內的距離並不好,因爲距離與人物對象無關。我想到了創建一個兩維陣列,它將第一列中的人物和第二列中的數據保存在一起。我認爲的另一個選擇是創建一個具有兩個值的容器對象,即人物和距離。

你認爲做這件事最有效率和「面向對象的方式」是什麼?

回答

6

它看起來像一個Map<Person, Double>的工作。

+0

我同意!它絕對適合一個地圖。你可以把它封裝在一個特定的類中 - 一個數據訪問對象(DAO)似乎適用於這種情況下,IMO。 – PhD

+0

如果新數據結構也需要保存,從原始文章中就不清楚了。 – toto2

+0

它不必被persistted。 – stdcall

-1

如果您創建一個包含Person,Address和距離精確點的對象(假設它是固定的),則可以在該對象的距離上實現Comparable。然後,您可以輕鬆地在距離精確點一定距離以內找到您的物品清單。

+0

精確點不固定,對象在數據庫中。我只收到與db相關的對象,所以我不需要比較。 – stdcall

1

我會建議Map<Person, Integer>其中Person是關鍵,距離是價值。

另一種選擇可能是番石榴的表類:Table<Person, Point, Integer>。這將是如果你想保持多點的距離。

0

您可以將搜索結果存儲爲包含所有Person和您的精確位置的對象,並且您可以在獲得結果集後確定距離。

2

我會提供一個持有距離和人員信息的連接類。

class PinPoint 
{ 
    private double x; // Assuming 
    private double y; 

    public List<Connection> getConnections(double radius) 
    { 
     // Return a list of connections with the person and distance information 
    } 
} 

class Connection 
{ 
    private double distance; 
    private Person person; 
} 

通過這種方式,您以後也可以在連接類中添加更多內容。如果你不需要它,一張簡單的地圖也可能足夠。

0

您可以擁有一個PersonGeoInfo類,該類可以持有對某人的引用以及您認爲合適的任何其他地理信息。

0

爲什麼不創建一個包含所有相關變量和數據結構的PinPoint類,例如由查詢填充的附近人員的簡單數組。

然後,您可以將您的PinPoint對象的實例放入您認爲對於當前任務最有用的數據結構中。

0

您應該創建一個名爲Pin或Marker的獨立對象。那麼你需要在Person和Marker之間的中間有一個多對多的表/對象。它可以被稱爲PersonToPin並且具有屬性person,pin和距離。

然後,您可以在人員身上有一個稱爲針的套裝和一個名爲針上的人的套裝。

自己做這些事情可能是一個真正的痛苦。我建議使用類似Hibernate或其他持久性庫的東西,它允許您專注於Java對象,並且庫將負責創建表和更新數據庫。