我有一个包含超过10万个数字对的数据表。其样本如下所示。
A B
0010 0010
0010 0011
0010 0019
0010 0056
0011 0010
0011 0011
0011 0019
0011 0040
0019 0010
0019 0058
此处A列中的数字可能存在于B列中。 说明:用户将有多个这些数字,范围为10 -100。现在我们可以看到0010 - 0011和0019存在。因此,如果用户的列表包含0010以及0011,则会显示警告,表示不允许使用此对,反之亦然。
如何在Java中解决这个问题? 使用所有数据加载哈希映射似乎不是一个好选择,尽管搜索速度会快得多。
请建议。谢谢
测试用例:
num = 0010; //value from list which user will be passing
test(num){
if(num.equals("0019")||num.equals("0011")) //compairing with database
System.out.println("incompatible pair present");
}
上面的例子是一个非常简单的伪代码。实际问题会让我复杂得多。
答案 0 :(得分:2)
直到问题更清楚...... 处理已存储在数据库中的大量数据让我给你一个建议:无论你想在这里做什么,考虑用SQL而不是Java来解决它。或者至少用结果ResultSet编写一个SQL,之后很容易在Java中进行评估。
但直到问题不明确......
答案 1 :(得分:1)
您是否在尝试查找A值相同但B值不同的条目?
SELECT t1.a, t1.b, t2.b
FROM MyTable t1, MyTable t2
WHERE t1.a = t2.b AND t1.b <> t2.b
答案 2 :(得分:0)
如果您担心堆空间不足,可以尝试使用ehcache之类的持久缓存。我建议您在进入此解决方案之前检查实际内存消耗
答案 3 :(得分:0)
似乎您的问题仅限于一个非常小的域 - 为什么无法实例化bool
的二维数组,并且只要两个数字的索引创建一个不受支持的组合,就将其设置为true
。 / p>
使用示例:
if (forbiden[10][11] || forbiden[11][10])
{
throw new Exception("pairs of '10' and '11' are not allowed");
}
您可以通过遍历数据并设置此数组,从数据库中实例化此数组。您只需将0010
翻译为10
即可。您将在索引0-9中获得垃圾,但您可以通过从9
中减去索引来“翻译”索引来消除它。
这会影响你的问题吗?
答案 4 :(得分:0)
如果我已正确理解你想做什么......
在t1(a,b)
上创建唯一索引。将用户的新对放在try块中的INSERT语句 中。捕获密钥冲突异常(将是SQLException
,可能是一个子类,具体取决于您的RDBMS)并向用户解释这是一个禁止的对。
答案 5 :(得分:0)
澄清问题: 您有一个表,其中包含两个数字,每个记录被声明为“不兼容”。 您有一个用户的数字列表,并且您想要检查此列表是否包含“不兼容的数字”。正确?
在这里,您将使用一个简单的SQL(以评论为例):
SELECT *
FROM incompatible
WHERE A IN (1, 14, 67) AND B IN (1, 14, 67);
此SQL返回所有不兼容性。当结果集为空时,没有不兼容性,一切都很好。如果您只想检索此事实,则可以改为编写SELECT 1 ...
。
当然,必须动态构建SQL以包含IN
子句中的用户编号。
要加快查询速度,您可以在两列上创建(唯一)索引。因此数据库可以进行索引范围扫描(唯一)。 如果此表尚未包含主键,则应在两列上创建主键。
答案 6 :(得分:0)
简单 - 绝对不可扩展的解决方案 - 如果你的范围真的是0000 - 9999。
只需一个包含999999个条目的字节表。 每个条目包含一个简单的0表示允许或1表示不允许。 您可以通过逻辑连接两对数字来找到表中的条目(key = first * 1000 + second)。
可扩展性更高的数据库解决方案是创建一个带有复合主键(pair1和pair2)的表,仅存在一个表示不允许对的条目。