2017-01-03 49 views
1

我已經編寫了一個幫助組織家庭賬單的應用程序。問題在於,一個家庭可以住一個人以上,一個人可以有多個住所(例如我 - 在這兩種情況下:))。所以我決定讓用戶有可能將承包商(付款接收者)綁定到多個用戶和多個家庭。Java比較int數組,過濾並插入或更新到DB

在我的數據庫中,帳戶和承包商之間以及家庭和承包商之間有連接表。太好了,不是嗎?

現在,重點是我得到一個相關的用戶(或房屋)列表作爲sql數組,並最終保留爲整數[]數組。我做了一些虛擬的數據庫條目,所以我可以測試功能,它工作正常。

但是......我完全不知道如何正確地將更改的值存儲在數據庫中。我的桌子的結構是:

用戶 ID |用戶名| .... 1 | user1 | ... 2 | user2 | ...

承包商 ID |名稱| ... 1 |承包商1 | ...

users_contractors user_id | contractor_id | is_deleted 1 | 1 |假 1 | 2 |假 等.....

所以我得到的是:與承包商和與控制器(修改後的)相關的第二個用戶數組相關的用戶數組。現在我需要將值存儲在數據庫中。當用戶+承包商不存在 - 我需要插入該關係。如果它已經存在於數據庫中,但不存在於我的數組中(例如,連接已被刪除) - 我需要更新關係表並標記爲deleted = true。

我發現了一些關於如何比較兩個數組的解決方案,但他們都假設數組的長度相同,並且它們僅將相同索引的值進行比較。

所以我需要的是比較不是我們說的數組,而是數組值(如果一個數組包含另一個數組的值或相反)。這可以在沒有forloop-in-forloop的情況下實現嗎?

預先感謝您。 Tom

+0

您是否考慮過使用ORM解決方案來滿足您的需求?我認爲這會幫助你擺脫與設計對象和更新值有關的大部分問題。 – Amal

+0

我不確定我完全理解:您有一組用戶ID和一組承包商ID,您需要更新數據庫,以便數組1的所有用戶都與數組2的所有承包商有關? –

回答

2

你有什麼理由不使用數組而不使用Lists/Collections?這些可以幫助您搜索項目並使其更容易比較兩個項目。

我沒有手頭的IDE現在,所以這裏是一些僞代碼:

// Create a list with all the values (maybe use a hashset to prevent duplicates) 
List<int> all = new List(); 
all.addAll(A); 
all.addAll(B); 

//for each loop 
for (int i : all) { 
    boolean inA = A.contains(i); 
    boolean inB = B.contains(i); 
    if (inA && inB) { 
    // You can figure out the rest of these statements I think 
    } 
} 
+0

嗯,實際上 - 我從數據庫中獲得一個數組(從承包商c加入accounts_contractors選擇c.id,array_agg(u.id)u ...),所以我想通了 - 這將是最簡單的方法在Vaadin框架的TwinColSelect字段中預選值。 現在,我有一些疑問... :) –

+0

那麼,如果我想幫助提問者,那麼我應該怎麼做呢? –

+1

@DrIvol我對我的代碼做了一些更正。現在我將數據存儲在列表中。所以情況是,我需要知道兩個列表中的每個值的狀態:valA不在listB中,valB不在listA中,valA/valB存在於listB/listA中。所以,基本上,這是我需要的: if(!listA.contains(valB)) - 插入新行, if(!listB.contains(valA)) - 更新現有行(刪除), if(valA == valB) - 沒有任何改變,沒有什麼可做的。 –

1

感謝@DrIvol - 我已經成功使用代碼來解決這個問題:

List<Integer> allUsers = new ArrayList<Integer>(); 
    allUsers.addAll(bean.getUserId()); 
    allUsers.addAll(bean.getNewUserId()); 
    for(Integer i : allUsers) { 
     Boolean oldValue = bean.getUserId().contains(i); 
     Boolean newValue = bean.getNewUserId().contains(i); 
     if(oldValue && newValue) { 
      System.out.println(i + " value in both lists"); 
      // Nothing to do 
     } else if (oldValue && !newValue) { 
      System.out.println(i + " value removed"); 
      // Set value as deleted 
     } else if(!oldValue && newValue) { 
      System.out.println(i + " value added"); 
      // Insert new value to concat table 
     } 
    } 

它有一個問題:如果該值在第一個列表中,並且它仍然在第二個列表中(沒有修改) - 則會檢查兩次。但是,因爲我不需要對這個值做任何事情 - 現在可以接受。有一天,當我完成測試版時 - 我會做一些優化,所以我會爲列表製作一些重複數據刪除器:)

非常感謝!

Tom

+0

謝謝你提到我!爲了防止檢查重複項,你可以改變'List allUsers = new ArrayList ();''Set allUsers = new HashSet ();'。如果我沒有記錯的話,HashSets會自動忽略重複值。循環應該像現在這樣工作,但它不再按順序執行。 –

+0

我不在乎'回合的命令。我會給HashSet一個嘗試,但首先我需要構建第一個測試版本 - 這是我的首要任務:)之後 - 我將有更多時間進行清理和優化... –