2011-05-15 36 views
0

執行數據庫調用,結果是一串包含AB類型的兩個字符串列的行。例如(x_a, y_b), (x_a, y1_b), (x2_a,y_b)在while循環用完之前對內部列表進行排序(Java)

這個想法是想出一張地圖列表,如{(x_a,{y_b,y1_b}), (x2_a,{y_b})},其中類型A的對象不重複,並在從數據庫中提取結果時執行此操作。

這裏就是我想:當結果對象的最後TYPE1值相同

int i =0; 
      List<String> type2 = new ArrayList<String>(); 
      Map<String,List<String>> type1_type2 = new HashMap<String,List<String>>(); 
      List<Map> list_type1_type2 = new ArrayList<Map>(); 

      String [] type1Array = new String[100]; 
      String [] type2Array = new String[100]; 
      int trackStart = 0; 
while (res.next()){ 


       String type1 = res.getString(1); 
       String type2 = res.getString(2); 
       type1Array[i]=type1; 
       type2Array[i] = type2; 


       if(i>0 && !type1Array[i].equals(type2Array[i-1])){ 
        int trackStop = i; 
        for(int j = trackStart; j<trackStop;j++){ 
         type2.add(type2Array[j]); 
        } 
        type1_type2.put(type1Array[i-1], type2); 
        list_type1_type2.add(type1_type2); 

       //debugging stuff 
       String x = list_type1_type2.toString(); 
     System.out.println(x); 
System.out.println(" printing because "+ type1Array[i]+" is not equal to " + type1Array[i-1]); 
     type2 = new ArrayList<String>(); 
    type1_type2 = new HashMap<String,List<String>>(); 
        trackStart=i; 
        } 

        i++; 


       } 

這種方法是行不通的。

有沒有一種方法可以在沒有首先將數據庫調用的結果存儲在單獨的數組中或在while循環之外添加一個額外for循環來以相同的精神(在while(res.next)內)執行此操作以「patch它「?

+0

Ugg確實很難讀取代碼。我會認真考慮重構以避免使用field1,field2等類型變量命名。它使事情變得非常難以遵循。其次,你是否研究過使用集合類代替數組是否可以更好地編寫代碼?它使事情變得簡單得多。 – drekka 2011-05-15 03:56:40

+0

只是一個提示:當你需要嵌套Collection類時,通常表明你應該創建一個新的類來包含所有的東西,否則組織這個行爲將會變得非常單調乏味並且犯下愚蠢的錯誤。 – corsiKa 2011-05-15 04:01:32

回答

0

簡單的方法是使用Guava/Google Collections SetMultiMap。這本質上是從一個鍵(你的'A'對象)到一組值(你的'B'對象)的映射。

[我不會試着爲你編碼。你目前的代碼太恐怖了,除非你付錢給我:-)]

但是,更好的辦法是讓數據庫進行排序。如果可以這樣做,那麼您將減少通過數據庫連接發送的(冗餘)數據量(假設您正在使用JDBC)。

+0

大聲笑...我當然不指望你編碼...這很難打出一個粗糙的草稿...感謝我看着番石榴......有一些清理/修補我的代碼工作..只是想知道如果有一個根本不同的解決方案... – algorithmicCoder 2011-05-15 05:08:34

0

如果你不希望像{x_a:[y_b,y_b]}重複再使用一組作爲地圖的價值:

Map<String,Set<String>> type1_type2; 

我不知道其他各種列表數組是爲了。您可能只需使用type1_type2地圖即可。在僞代碼中處理每個(x,y):

Set s = type1_type2.get(x) 
if s == null: 
    s = new Set() 
    type1_type2.put(x, s) 
s.add(y)