这是一个很大的概念性问题,因此我没有任何代码可显示。我会尽力解释这一点。我正在编写一个程序,该程序应该查找在大型随机组合表中找到的常见数字序列。
因此,以以下数据为例:
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位数(或更多)序列,我需要将其放入另一个数据库中多次。因此,第一行包含“5 3 9”,第六行也包含“5 3 9”。我将把该序列与找到它的次数放到一个单独的表中。
我仍在研究实际进行这些比较的算法,但我想我必须从“1 5 3”开始,将其与找到的每个3数字三重奏进行比较,然后继续进行“5 3 9”,然后选择“3 9 6“等。
我现在的主要问题是,如果这些数字存储在数据库中,我不知道该怎么做。我的数据库表有11列。每个数字一栏,整个10位数序列一栏。列称为序列,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);
Ouput:
{920=1, 783=1, 945=1, 332=1, 963=1, 644=1, 156=1, 983=1, 453=1, 153=1, 388=1, 534=1,
455=1, 245=1, 539=2, 554=1, 242=1, 555=1, 553=1, 437=1, 883=1, 349=1, 755=1, 675=1,
638=1, 395=1, 201=1, 956=1, 933=1, 499=1, 634=1, 839=1, 794=1, 027=1, 477=1, 833=1,
347=1, 492=1, 378=1, 279=1, 993=1, 443=1, 396=1, 398=1, 549=1, 563=1, 424=1}
然后,您可以从地图将这些值存储在数据库中。