1.彩票官网复制历史数据,存入文件
2.基本处理逻辑
1.红球组合
2.排除红球连号(自定义3、4、5、6个连续)
3.红蓝组合(自定义蓝球出现的可能,比如我想蓝号只出1或者12…)
4.解析历史数据,排除这些数据
5.定义大小分布,以一个数为中间数,大于他包含几个,小于他的包含几个,再次过滤不满足此条件的数据
6.定义一个包含的过滤,数据中,红球包含某些数字,否则过滤
7.将结果输出到文件中
package com.pgf.doblecolorball;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.math.MathUtil;
/*
作者:pgf
时间:2019年12月19日
描述:TODO
*/
public class SixAndOne {
/*往期数据文件*/
private static final String HISTORY_PATH = "D:\\winBall.txt";
private static final int BALL_LENGTH = 7;
private static final String REG = ",";
/*高低区分数*/
private static final int Midd = 15;
/**红球号码**/
private static final String[] RED_BALLS = {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32"};
/**预测蓝球号码**/
//private static final String[] BLUE_BALLS1 = {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16"};
private static final String[] BLUE_BALLS = {"14"};
/**排除包含号码**/
private static final String[][] FILETERS2 = {
{"1","2"},{"2","3"},{"3","4"},{"4","5"},{"5","6"},{"6","7"},{"7","8"},
{"8","9"},{"9","10"},{"10","11"},{"11","12"},{"12","13"},{"13","14"},
{"14","15"},{"15","16"},{"16","17"},{"17","18"},{"18","19"},{"19","20"},
{"20","21"},{"21","22"},{"22","23"},{"23","24"},{"24","25"},{"25","26"},
{"26","27"},{"27","28"},{"28","29"},{"29","30"},{"30","31"},{"31","32"},
{"32","33"},{"33","34"}};
private static final String[][] FILETERS3 = {{"1","2","3"},{"2","3","4"},{"3","4","5"},{"4","5","6"},{"5","6","7"},
{"6","7","8"},{"7","8","9"},{"8","9","10"},{"9","10","11"},{"10","11","12"},
{"11","12","13"},{"12","13","14"},{"13","14","15"},{"14","15","16"},{"15","16","17"},
{"16","17","18"},{"17","18","19"},{"18","19","20"},{"19","20","21"},{"20","21","22"},
{"21","22","23"},{"22","23","24"},{"23","24","25"},{"24","25","26"},{"25","26","27"},
{"26","27","28"},{"27","28","29"},{"28","29","30"},{"29","30","31"},{"30","31","32"}};
private static final String[][] FILETERS4 = {{"1","2","3","4"},{"2","3","4","5"},{"3","4","5","6"},{"4","5","6","7"},{"5","6","7","8"},
{"6","7","8","9"},{"7","8","9","10"},{"8","9","10","11"},{"9","10","11","12"},{"10","11","12","13"},
{"11","12","13","14"},{"12","13","14","15"},{"13","14","15","16"},{"14","15","16","17"},{"15","16","17","18"},
{"16","17","18","19"},{"17","18","19","20"},{"18","19","20","21"},{"19","20","21","22"},{"20","21","22","23"},
{"21","22","23","24"},{"22","23","24","25"},{"23","24","25","26"},{"24","25","26","27"},{"25","26","27","28"},
{"26","27","28","29"},{"27","28","29","30"},{"28","29","30","31"},{"29","30","31","32"}};
private static final String[][] FILETERS5 = {{"1","2","3","4","5"},{"2","3","4","5","6"},{"3","4","5","6","7"},{"4","5","6","7","8"},
{"5","6","7","8","9"},{"6","7","8","9","10"},{"7","8","9","10","11"},{"8","9","10","11","12"},
{"9","10","11","12","13"},{"10","11","12","13","14"},{"11","12","13","14","15"},{"12","13","14","15","16"},
{"13","14","15","16","17"},{"14","15","16","17","18"},{"15","16","17","18","19"},{"16","17","18","19","20"},
{"17","18","19","20","21"},{"18","19","20","21","22"},{"19","20","21","22","23"},{"20","21","22","23","24"},
{"21","22","23","24","25"},{"22","23","24","25","26"},{"23","24","25","26","27"},{"24","25","26","27","28"},
{"25","26","27","28","29"},{"26","27","28","29","30"},{"27","28","29","30","31"},{"28","29","30","31","32"}};
private static final String[][] FILETERS6 = {{"1","2","3","4","5","6"},{"2","3","4","5","6","7"},{"3","4","5","6","7","8"},{"4","5","6","7","8","9"},
{"5","6","7","8","9","10"},{"6","7","8","9","10","11"},{"7","8","9","10","11","12"},{"8","9","10","11","12","13"},
{"9","10","11","12","13","14"},{"10","11","12","13","14","15"},{"11","12","13","14","15","16"},{"12","13","14","15","16","17"},
{"13","14","15","16","17","18"},{"14","15","16","17","18","19"},{"15","16","17","18","19","20"},{"16","17","18","19","20","21"},
{"17","18","19","20","21","22"},{"18","19","20","21","22","23"},{"19","20","21","22","23","24"},{"20","21","22","23","24","25"},
{"21","22","23","24","25","26"},{"22","23","24","25","26","27"},{"23","24","25","26","27","28"},{"24","25","26","27","28","29"},
{"25","26","27","28","29","30"},{"26","27","28","29","30","31"},{"27","28","29","30","31","32"}};
/*红球包含*/
private static final String[] FILETER5 = {"10","12"};
/*高低分布,模拟大于Midd的M,小于等于Midd的N,M+N=6*/
private static final int[] HIGH_LOW = {2,4};
public static void main(String[] args) throws Exception{
long tStart = System.currentTimeMillis()/1000;
/*创建线程解析文件*/
ReadWinBall readWinBall = new ReadWinBall();
FutureTask<String> task = new FutureTask<>(readWinBall);
new Thread(task).start();
/*红球组合*/
List<String[]> redCombined = combinedMbaseFromTotalArr(RED_BALLS, 6);
List<String[]> blueCombined = combinedMbaseFromTotalArr(BLUE_BALLS, 1);
/*红球过滤连号后*/
List<String[]>redClean = new ArrayList<>();
List<String[]>redAndBlueClean = new ArrayList<>();
/*happyDatas*/
List<String[]>happyDatas = new ArrayList<>();
List<String>finalWinDatas = new ArrayList<>();
/*过滤结果*/
//1.红球排除filters连号
System.out.println("---------------红球过滤开始--------------");
long start = System.currentTimeMillis()/1000;
for (String[] item : redCombined) {
if(dataFileter(item, FILETERS2,FILETERS3,FILETERS4,FILETERS5,FILETERS6)){
redClean.add(item);
// if(containEle(item, new String[]{"1","2","4","5"})){
// System.out.println(Arrays.toString(item));
// }
}
}
long end = System.currentTimeMillis()/1000;
System.out.println("---------------红球过滤结束--------------耗时(秒):"+(end-start)+" ==组合记录总数:"+redClean.size());
System.out.println("---------------红蓝组合开始--------------");
long start1 = System.currentTimeMillis();
for(int i=0;i<redClean.size();i++){
for (int j=0; j<blueCombined.size();j++) {
/*合并红蓝*/
String[] item = twoArrsMerge(redClean.get(i), blueCombined.get(j));
redAndBlueClean.add(item);
}
}
long end1 = System.currentTimeMillis();
System.out.println("---------------红蓝组合结束--------------耗时(豪秒):"+(end1-start1));
task.get();
//System.out.println(get);
List<String[]> winDatas = readWinBall.list;
//BufferedWriter wr = new BufferedWriter(w);
System.out.println("---------------过滤历史出球开始--------------");
long start2 = System.currentTimeMillis();
for (String[] item : redAndBlueClean) {
if(winEle(winDatas, item)){
if(FILETER5.length > 0){
if(containEle(item, FILETER5)){
//happyDatas.add(Arrays.toString(item));
happyDatas.add(item);
}else{
//happyDatas.add(Arrays.toString(item));
happyDatas.add(item);
}
}
}
}
long end2 = System.currentTimeMillis();
System.out.println("---------------过滤历史出球结束--------------耗时(毫秒:)"+(end2-start2));
System.out.println("---------------高低分配开始--------------");
long start3 = System.currentTimeMillis();
for (String[] item : happyDatas) {
//String[] data = item.split("REG");
if(highLowRegion(HIGH_LOW[0], HIGH_LOW[1], item)){
finalWinDatas.add(Arrays.toString(item));
}
}
long end3 = System.currentTimeMillis();
System.out.println("---------------高低分配结束--------------耗时(豪秒)"+(end3-start3));
System.out.println("---------------写入文件开始--------------");
FileUtil.writeLines(finalWinDatas, new File("D:\\money.txt"), "utf-8");
System.out.println("---------------写入文件结束--------------");
System.out.println("总记录:"+finalWinDatas.size());
long tEnd= System.currentTimeMillis()/1000;
System.out.println("总耗时(秒):"+(tEnd-tStart));
}
/**
* 过滤数据高低分布
*时间: 2019年12月20日
*描述: 红球的数字高低个数分配
* @param high
* @param low
* @param arr
* @return
*/
public static boolean highLowRegion(int high,int low,String[] arr){
if(high+low != (BALL_LENGTH-1)){
throw new RuntimeException("高低分配之和必须等于6");
}
int highN = 0;
for (int i=0; i<BALL_LENGTH-1;i++) {
int intValue = Integer.valueOf(arr[i].trim()).intValue();
if(intValue>Midd){
highN++;
}
}
if(highN != high)return false;
return true;
}
/**
*
*时间: 2019年12月19日
*描述: 过滤数据
* @param a 抽取数组
* @param fileters 过滤器
* @return true可用数据,false已被过滤
*/
public static boolean dataFileter(String [] a,String[][] ... fileters){
//重复集合,如果a集合 加上fileter的集合 大小=长度相加 size = a 那么包含fileter
for (String[][] item : fileters) {
Set<String> bSetOld = new HashSet(Arrays.asList(a)); // b 集合
int bSize = bSetOld.size();
for(int i=0;i<item.length;i++){//二维数组
//System.out.println(Arrays.toString(item[i]));
Set<String> bSetNew = new HashSet(Arrays.asList(a));
bSetNew.addAll(Arrays.asList(item[i]));
/*如果包含filters数据,直接返回false*/
if(bSize == bSetNew.size()){
//System.out.println("=====过滤数据======"+Arrays.asList(item[i]));
return false;
}
}
}
return true;
}
/**
* 字符数组转为int数组
*时间: 2019年12月19日
*描述: TODO
* @param arrs
* @return
*/
public static int[] StringToInt(Object[] arrs){
int[] ints = new int[arrs.length];
for(int i=0;i<arrs.length;i++){
ints [i] = Integer.parseInt((String)arrs[i]);
}
return ints;
}
/**
*
*时间: 2019年12月19日
*描述: 组合m选n
* @param datas 基础数据组合
* @param m 选择个
* @return
*/
public static List<String[]> combinedMbaseFromTotalArr(String[] datas, int m){
return MathUtil.combinationSelect(datas, m);
}
/**
* 两个数组合并
*时间: 2019年12月19日
*描述: TODO
* @param a
* @param b
* @return
*/
public static String[] twoArrsMerge(String[] a,String[] b){
String[] res = new String[BALL_LENGTH];
List<String>list = new ArrayList(Arrays.asList(a));
list.addAll(Arrays.asList(b));
for(int i=0;i<list.size();i++){
res[i] = list.get(i);
}
return res;
}
/**
* 包含的数字
*时间: 2019年12月20日
*描述: TODO
* @param arr
* @param ele
* @return
*/
public static boolean containEle(String[] arr,String[] ele){
Set<String> bSetOld = new HashSet(Arrays.asList(arr)); // b 集合
int bSize = bSetOld.size();
bSetOld.addAll(Arrays.asList(ele));
/*如果包含filters数据,直接返回false*/
if(bSize == bSetOld.size()){
return true;
}else{
return false;
}
}
/**
* 解析历史数据文件
* @author Administrator
*
*/
private static class ReadWinBall implements Callable<String>{
private List<String[]>list = new ArrayList<>();
@Override
public String call() throws Exception {
System.out.println("---------------解析往期出球文件开始--------------");
long start = System.currentTimeMillis();
File file = new File(HISTORY_PATH);
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "utf-8"));
String data = null;
while((data=br.readLine()) != null){
String[] datas = data.split(",");
for(int i=0;i<datas.length;i++){
datas[i] = datas[i].trim();
}
list.add(datas);
}
long end = System.currentTimeMillis();
System.out.println("---------------解析往期出球文件结束--------------耗时(毫秒)"+(end-start));
return "1";
}
}
/**
* 过滤往期数据
*时间: 2019年12月19日
*描述: TODO
* @param res
* @param ele
* @return
*/
public static boolean winEle(List<String[]>res,String[] ele){
//Arrays.sort(ele);
for (String[] item : res) {
//Arrays.sort(item);
if(Arrays.equals(item, ele)){
return false;
}
}
return true;
}
}