我写了一个应用程序,帮助组织家庭账单。问题是,在一个家庭中可以住多个人,一个人可以有一个以上的家(例如我 - 在这两种情况下:))。因此,我决定让用户将承包商(支付接收方)绑定到多个用户和多个家庭。
在我的数据库中,帐户和承包商之间以及房屋和承包商之间存在串联表。太好了,不是吗?
现在,重点是我将相关用户(或房屋)的列表作为sql数组获取,最后我将其保留为Integer []数组。我已经制作了一些虚拟数据库条目,所以我可以测试它的功能并且工作正常。
但是......我完全不知道如何在数据库中正确存储更改的值。我的表的结构是:
用户 id |用户名| .... 1 | user1 | ... 2 | user2 | ...
承包商 id |名字| ... 1 |承包商1 | ...
users_contractors user_id | contractor_id | IS_DELETED 1 | 1 |假 1 | 2 |假 等......
所以我拥有的是:与承包商相关的一组用户和与contrator相关的第二个用户数组(修改后的用户)。现在我需要将值存储在DB中。当用户+承包商不存在时 - 我需要插入该关系。如果它已经存在于数据库中,但在我的数组中不存在(例如连接被删除) - 我需要更新关系表并标记为deleted = true。
我找到了一些关于如何比较两个数组的解决方案,但它们都假设数组的长度相同,并且它们只比较具有相同索引的值。
所以我需要的是比较我们说的不是数组,但数组值(如果一个数组包含来自另一个数组的值,或相反)。这可以在没有forloop-in-forloop的情况下实现吗?
提前谢谢你。 汤姆
答案 0 :(得分:2)
你有没有理由使用数组而不是列表/集合?这些可以帮助您搜索项目,并更容易比较其中两个。
我现在没有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
}
}
答案 1 :(得分: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
}
}
它有一个问题:如果值在第一个列表中,并且它仍然在第二个列表中(没有修改) - 它会被检查两次。但是,因为我不需要对这个值做任何事情 - 现在它是可以接受的。有一天,当我完成测试版时 - 我会做一些优化,所以我会为列表制作一些重复数据删除器:)
非常感谢!
汤姆