用Java比较MySQL表中的行最有效的方法是什么

用Java比较MySQL表中的行最有效的方法是什么,java,mysql,sql,database,Java,Mysql,Sql,Database,这主要是一个概念性的问题,所以我没有任何代码可以显示。我会尽力解释的。我正在写一个程序,该程序应该能够找到在一个大的随机组合表中找到的常见数字序列 以这些数据为例: 1 5 3 9 6 3 8 8 3 3 6 7 5 5 5 4 9 2 0 1 6 4 4 3 7 8 3 9 5 6 2 4 2 4 5 5 3 4 7 7 1 5 6 3 4 9 9 3 3 2 0 2 7 9 4 5 3 9 8 3 这些是数字1-9的随机组合。对于每3位数(或更多)的序列,我需要将其放入另一个

这主要是一个概念性的问题,所以我没有任何代码可以显示。我会尽力解释的。我正在写一个程序,该程序应该能够找到在一个大的随机组合表中找到的常见数字序列

以这些数据为例:

1 5 3 9 6 3 8 8 3 3

6 7 5 5 5 4 9 2 0 1

6 4 4 3 7 8 3 9 5 6 

2 4 2 4 5 5 3 4 7 7 

1 5 6 3 4 9 9 3 3 2

0 2 7 9 4 5 3 9 8 3
这些是数字1-9的随机组合。对于每3位数(或更多)的序列,我需要将其放入另一个数据库。所以第一行包含“539”,第六行也包含“539”。我会把这个序列放在一个单独的表中,列出它被发现的次数

我仍在研究实际进行这些比较的算法,但我想我必须从“1 5 3”开始,将其与找到的每一个3数字三人组进行比较,然后转到“5 3 9”然后是“3 9 6”等等

我现在的主要问题是,如果这些数字存储在数据库中,我不知道怎么做。我的数据库表有11列。每一个数字对应一列,整个10位序列对应一列。列称为Sequence、1stNum、2ndNum、3rdNum…10thNum

视觉:我数据库中上述数据的第一行是:

|  1 5 3 9 6 3 8 8 3 3  |  1  |  5  |  3  |  9  |  6  |  3  |  8  |  8  |  3  |  3  |
(“|”分隔列)

如何有效地与Java进行比较?我对表中的每一行都进行了多次迭代。一次是比较初始序列,每一个序列我都会遍历每一行。基本上是for循环中的for循环。这听起来像是需要大量的查询,如果表变得庞大(它将如此),这可能需要永远的时间

如果使用查询遍历数据库,或者转储数据库并遍历文件,计算效率会更高吗?


我尽可能地解释这一点,这对我来说是一个非常混乱的过程。我可以澄清你需要我澄清的任何事情。我只需要关于这方面的最佳行动方案的指导。

假设您已检索到列表中的序列,我会这样做:

List<String> sequences = Arrays.asList("1539638833","6755549201","6443783956","2424553477","1563499332","0279453983");
Map<String,Integer> count = new HashMap<>();
for (String seq : sequences) {
    int length = seq.length();
    for (int i=0 ; i<length - 2 ; i++) {
        String sub = seq.substring(i,i + 3);
        count.put(sub,count.containsKey(sub) ? count.get(sub) + 1 : 1);
    }
}
System.out.println(count);   

然后,您可以将这些值从映射存储到数据库中。

您可以在sql中使用union子句执行此操作:

select sum(c), sequence 
from
(   
    select
        count(*) as c, concat(col1 ,col2 , col3) as sequence
        from t
        group by col1, col2, col3
    union
    select
        count(*) as c, concat(col2 ,col3 , col4) as sequence
        from t
        group by col2, col3, col4
    union (... and so on enumerating through the column combinations)
) as tt
group by sequence
我可以想象一个纯java实现会更快,并且拥有更少的资源 内存开销。但是,如果数据库中已经有了它,可能会很快
够了。

你为什么要这样做?难道你不能把所有的内容都读入一个列表并在内存中排序吗?这是我正在玩的一个个人编程项目的一部分。细节让人很困惑,但我试图把它作为一个独立的问题来解释。“我根本没有对它进行排序。@ElliottFrisch数字的顺序很重要,所以对它进行排序将无法达到目的。”。如果这就是你的意思。
我仍在研究实际进行这些比较的算法,但我想我必须从“1 5 3”开始,将其与找到的每一个3数字三人组进行比较,然后转到“5 3 9”然后是“3 9 6”等等……
我认为这不是一个好主意。我宁愿使用哈希集来存储遇到的每个三元组。每次发生碰撞时,我都会增加映射中这个三元组的计数器。通过这种方式,我认为您将节省大量时间,因为在HashSet中插入比比较其他三元组花费更少?您想要序列的最小值还是最大值?将其映射到一个可比较的3字段POJO?是的,这绝对是它的一部分。我预见的下一个问题是,在3位数之后,我必须转到4位数,然后依此类推,但相比之下,这似乎更简单。另外,由于这些序列存储在我的数据库中,我认为最好的做法是查询一次,然后将所有序列放入一个初始列表中,嗯?还有一点疯狂,那就是在数据库中找到的三个常见数字是“539”我真的希望找到不止一个序列。@RyanBrady:我也认为这是一种有效的方法。如果您想要有4位数字或任意数量的数字,只需对代码稍加修改即可。最后,总共有1000个可能的组合,而您的示例中只有48个,因此没有重复的概率非常高。您不知道我使用此选项有多兴奋:)我没想到会有11行代码哈哈。我打算玩玩它,但我可能会回来问问题。非常感谢。我会回来并勾选这个答案,如果它按预期工作。@RyanBrady:哈哈,让Java集合API成为你的朋友,让它变得高效
HashSet
HashMap
非常有用。您应该阅读他们的文档以及
ArrayList
LinkedList
TreeSet
。然后,根据您的需要,还有一些其他有趣的类,如
ArrayDeque
PriorityQueue
…Holy cow。我不太擅长构造SQL查询,但我从来没有想过这样做是可能的。当你说“col1”、“col2”等时,这些列应该包含各个数字,对吗?您对包含整个10位序列的列不做任何操作?对于您的表,col1将是“1stNum”。在10序列列中添加会破坏结果,因为分组都是唯一的,除非10位数重复。group by子句只能包含“分组依据”的列。Sql确实不希望将其记录视为数组。这就是为什么它将是一个非常冗长的查询,因为您不能像在过程语言中那样轻松地索引行。如果你想尝试每一种组合,打字会有点乏味,但绝对可行。
select sum(c), sequence 
from
(   
    select
        count(*) as c, concat(col1 ,col2 , col3) as sequence
        from t
        group by col1, col2, col3
    union
    select
        count(*) as c, concat(col2 ,col3 , col4) as sequence
        from t
        group by col2, col3, col4
    union (... and so on enumerating through the column combinations)
) as tt
group by sequence