2011-05-13 89 views
0

我有一組java對象結果集。我的結果類的定義是這樣的:如何檢查一個Set是否包含一個成員變量等於某個值的對象

private String url; 
private String title; 
private Set<String> keywords; 

我已經存儲了我的信息在數據庫中的表名爲關鍵詞,看起來像這樣

關鍵詞= [ID,URL,標題,關鍵詞,日期,時間]

正如您所看到的,數據庫中的對象與行之間不存在一對一映射。我正在使用SQL(MySQL DB)來提取值並具有合適的ResultSet對象。

如何檢查Set是否已經包含具有給定URL的Result。

如果該集合已經包含一個包含當前URL的Result對象,那麼我只是想將其他關鍵字添加到關鍵字集合中,否則我會創建一個新的Result對象來添加到結果對象集合中。

回答

0

如果可能的話,我建議改變你的數據庫設計來消除這個問題。您當前的設計請求會爲每個關鍵字存儲一次id,url,標題和日期時間,如果您有很多關鍵字,則可能浪費相當多的空間

我建議有兩張表。假設id字段保證唯一,第一個表將存儲id,url,title和date-time,並且每個id只有一行。第二個表格將存儲id和一個關鍵詞。根據需要,您可以在該表格中插入多行。

這有可能/有意義嗎?

+0

這是有道理的,但它會減慢查詢。我想知道是否有明顯的解決方案。我可以把一些笨重但有效的東西放在一起。 – Ankur 2011-05-13 07:24:00

1

當您遍歷JDBC結果集(創建自己的結果集)時,爲什麼不將它們放入Map中?事實後創建地圖:

Map<String, List<Result>> map = new HashMap<String, List<Result>>(); 
for (Result r : resultSet) { 
    if (map.containsKey(r.url)) { 
     map.get(r.url).add(r); 
    } else { 
     List<Result> list = new ArrayList<Result>(); 
     list.add(r); 
     map.put(r.url, list); 
    } 
} 

然後只需使用map.containsKey(url)來檢查。

0

您可以使用的URL的Map作爲關鍵字:

Map<String, Result> map = new HashMap<String, Result>(); 

for (Result r : results) { 
    if (map.containsKey(r.url)) { 
     map.get(r.url).keywords.addAll(r.keywords); 
    } else { 
     map.put(r.url, r); 
    } 
} 
0

我認爲你需要在平等的倍率(你的結果類的)方法。在這種方法中,你會把你的邏輯,將檢查你在找什麼。

N.B.您還需要知道重寫equals()方法,您還需要重寫hashCode()方法。

有關「覆蓋equals()和hashCode()方法」主題的更多信息,您可以查看this另一個問題。

相關問題