public void getAllDatas(){
String address="http://nba.sports.sina.com.cn/league_order1.php";
try {
URL url=new URL(address);
try {
InputStream inputStream=url.openStream();
InputStreamReader inputStreamReader=new InputStreamReader(inputStream,"gbk");
BufferedReader reader=new BufferedReader(inputStreamReader);
String rankRegEx = ">\d{1,2}";// 排名正则
String teamRegEx = ">[^<>]*";// 队名正则
String dataRegEx = ">\d{1,3}(\.)\d{0,2}";// 正常数据正则
String percentRegEX = ">\d{1,2}(\.)*(\d)*%";// 百分比数据
GetRegExData regExData=new GetRegExData();
String temp= "";//存放临时数据
int flag=0;
String tempRank = "";// 存放匹配到的返回数据
String tempTeam = "";// 存放匹配到的返回数据
String tempData = "";
String tempPercent = "";
Listlist=new ArrayList();
Mysql mysql=new Mysql();
while ((temp=reader.readLine())!=null){
//匹配排名
if ((tempRank = regExData.getData(rankRegEx, temp)) != "") {
tempRank = tempRank.substring(1, tempRank
.indexOf(""));
// System.out.println("排名:" + tempRank);
list.add(tempRank);
flag++;
}
// 匹配球队
// 由于该正则会匹配到其他地方的数据,需给它一个标识符,让它从"找到排名位置"才开始匹配
if ((tempTeam = regExData.getData(teamRegEx, temp)) != ""
&& flag == 1) {
tempTeam = tempTeam.substring(1, tempTeam
.indexOf(""));
// System.out.println("球队名称:" + tempTeam);
list.add(tempTeam);
flag = 0;
}
// 匹配正常数据
if ((tempData = regExData.getData(dataRegEx, temp)) != "") {
tempData = tempData.substring(1, tempData
.indexOf(""));
// System.out.println(tempData);
list.add(tempData);
}
// 匹配百分比数据
if ((tempPercent = regExData.getData(percentRegEX, temp)) != "") {
tempPercent = tempPercent.substring(1, tempPercent
.indexOf("</span></td>"));
// System.out.println(tempPercent);
list.add(tempPercent);
}
}
reader.close();
Object[] arr = list.toArray();// 将集合转换为数组
int a = -15;
int b = 0;
String sql = "insert into data(rank,team,win,lose,winpercent,windifferent,score,losescore,scoredifferent,host,out,part,square,recent,winplus)values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
for (int i = 0; i <30; i++) {
a += 15;
b += 15;
if (b <=450) {
Object[] arr1 = Arrays.copyOfRange(arr, a, b);
mysql.insertNewData(sql, arr1);
System.out.println("正在采集数据..当前采集数据:" + (i + 1) + "条");
}
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
首先对这个方法进行一个解析:
copyOfRange(T[] original, int from, int to) :这个方法的意思是从original数组中拷贝从第from位至第to位的元素,返回一个新数组。
1、如果拷贝的范围超过original的返回,返回的将是某数组类型的初始值,例如,int类型的数组初始值是0,对象类型的初始值是null等,
2、这个方法内部实现是创建是依据传入的to - from得来的长度,创建的一个新生数组,在拷贝的时候只是将数组的对应位拷贝进数组
下面类分析一个这个问题错误的根源在哪里:
主要的问题是出现在循环语句的i++上面,也就是循环次数上,具体的解法我已经在下面给出了代码,请参考。
题主的意思,就是想拷贝数组的制定长度作为sql的参数:那么可以有一下的一个方案:
Object[] iArr = new Object[10];
for (int i = 0; i < iArr.length; i++) {
iArr[i] = i;
}
//计算拆分成每份五个元素需要循环几次
int times = (int) Math.ceil(iArr.length / 3.0);
int start = 0;
int end = 0;
for (int i = 0; i < times; i++) {
start = i * 3;
end = 3 * (i + 1);
if(end > iArr.length) {
end = iArr.length;
}
Object [] arr = Arrays.copyOfRange(iArr, start, end);
System.out.println(Arrays.toString(arr));
}
说真的,我没看懂你这么写是什么意思,但是
copyOfRange(T[] original, int from, int to)
将指定数组的指定范围复制到一个新数组。
也就是说在迭代过程中 a的开始长度或者b的最终长度大于了arr的长度就会出现数组下标越界
“在迭代过程中 a的开始长度或者b的最终长度大于了arr的长度就会出现数组下标越界”
那肯定得传入合适的参数,,from,to,,,意思很明确,,从from到to。
传入参数不正确肯定是有问题的。
Object[] arr1 = Arrays.copyOfRange(arr, a, b);开始复制的时候应该先判断是否越界