二维数组中最大的子数组之和
一、问题
以指定格式的文本文件形式输入数组并将数组由一维变为二维。给出单元测试/代码覆盖率的最终覆盖率的报告。
二、代码实现
MaxIntArray.java
package test; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; public class MaxIntArray { public static void main(String[] args) throws IOException { Integer[][] c=new Integer[100][]; c=ReadFile("C:\\Users\\Administrator\\Desktop\\1.txt"); for(int i=0;i<c.length;i++){ for(int j=0;j<c[0].length;j++){ System.out.print(c[i][j]+" "); } System.out.println(); } // System.out.print(c[2][2]); System.out.println("1:"+GetMaxSUM(c)); // System.out.println("2"+MaxSUM(c)); } public static Integer[][] ReadFile(String str){ FileReader file = null; try { file = new FileReader(str); } catch (FileNotFoundException e) { e.printStackTrace(); } System.out.println("文件测试数据如下:"); BufferedReader br = new BufferedReader(file);//读取文件 try { String line = br.readLine();//读取一行数据 int lenx = Integer.parseInt(line);//将数据转化为int类型 line = br.readLine();//读取一行数据 int leny = Integer.parseInt(line);//将数据转化为int类型 // System.out.println(lines); String []sp = null; String [][]c = new String[lenx][leny]; Integer[][] cc = new Integer[lenx][leny]; int count=0; while((line=br.readLine())!=null) {//按行读取 sp = line.split(" ");//按空格进行分割 // System.out.println("Length:"+sp.length); // System.out.println("sp:"+sp[0]); for(int i=0;i<sp.length;i++){ c[count][i] = sp[i]; } count++; } for(int i=0;i<lenx;i++){ for(int j=0;j<leny;j++){ cc[i][j] = Integer.parseInt(c[i][j]); // System.out.print(cc[i][j]+" "); } // System.out.println(); } return cc; } catch (IOException e) { e.printStackTrace(); } return null; } public static int GetMaxSUM(Integer[][] a){ int n=a.length; int m=a[0].length; //分块 Integer[] Max=new Integer[100]; Integer[] Begin=new Integer[100]; Integer[] End=new Integer[100]; Integer[] b=new Integer[100]; for(int i=0;i<n;i++) { //按行分组 for(int j=0;j<m;j++) { b[j]=a[i][j]; } MaxIntArray(b,Max,Begin,End,m,i); } int max=Max[0]; for(int i=0;i<n-1;i++) { if((Begin[i]<=End[i+1]&&Begin[i]>=Begin[i+1])||(End[i]<=End[i+1]&&End[i]>=Begin[i+1])) { max=Max[i+1]+max; } else { //如果不能直接连通,判断代价是否合适 if(Begin[i]>End[i+1]) { int t = Begin[i]-End[i+1]; int s = Begin[i]; int temp=0; for(int k=0;k<t;k++) { temp+=a[i+1][s-k]; } if(temp+Max[i+1]>0) max=temp+Max[i+1]; } if(End[i]<Begin[i+1]) { int t = Begin[i+1]-End[i]; int s = End[i]; int temp=0; for(int k=0;k<t;k++) { temp+=a[i+1][s+k]; } if(temp+Max[i+1]>0) max=temp+Max[i+1]; } } } return max; } public static void MaxIntArray(Integer[] a,Integer[] max,Integer[] begin,Integer[] end,int n,int index){ Integer[] Max=new Integer[100]; Max[0] = 0; int i = 0;//数组下标 int j = 0;//最大值数组下标 int temp=0;//中间变量 //记录子数组的起始位置和末位 // Integer[] Bg=new Integer[100]; Integer[] Bg={-1,-1,-1,-1,-1}; Integer[] Ed=new Integer[100]; while(i<n){ if(temp+a[i]>=Max[j]) { temp=temp+a[i]; Max[j]=temp; if(Bg[j]==-1) Bg[j]=i; Ed[j]=i; i++; } else if(temp+a[i]<Max[j]&&temp+a[i]>0) { temp=temp+a[i]; i++; } else if(temp+a[i]<=0) { i++; j++; Max[j]=0; temp=0; } } max[index] = Max[0]; int q=0; for(int k=0;k<=j;k++){ if(Max[k]>max[index]) { max[index]=Max[k]; q=k; } } begin[index]=Bg[q]; end[index]=Ed[q]; } }
MaxIntArrayTest.java
package test; import org.junit.Test; import static org.junit.Assert.*; import static test.MaxIntArray.GetMaxSUM; import static test.MaxIntArray.ReadFile; public class MaxIntArrayTest { @Test public void test1() { String str="C:\\Users\\Administrator\\Desktop\\1.txt"; Integer[][] c=ReadFile(str); System.out.println(GetMaxSUM(c)); } }
三、单元测试结果
四、代码覆盖率
是软件测试中的一种度量,描述程序中源代码被测试的比例和程度,所得比例称为代码覆盖率。在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%。
代码覆盖率 = 代码的覆盖程度,一种度量方式。
以下为进行测试后所得到的代码覆盖范围以及覆盖率。
五、总结
1.分析未覆盖部分的代码,从而反推在前期测试设计是否充分,没有覆盖到的代码是否是测试设计的盲点,之后进行补充测试用例设计。
2.检测出程序中的废代码,可以逆向反推在代码设计中思维混乱点,提醒我理清代码逻辑关系,提升代码质量。
3.代码覆盖率高不能说明代码质量高,但是反过来看,代码覆盖率低,代码质量不会高到哪里去,可以作为测试自我审视的重要工具之一。
4.覆盖率数据只能代表你测试过哪些代码,不能代表你是否测试好这些代码。不能盲目追求代码覆盖率,而应该想办法设计更多更好的案例,哪怕多设计出来的案例对覆盖率一点影响也没有。