Java实验九:解决问题讲解(排序,数组,添加,删除的应用)

Harmony ·
更新时间:2024-09-20
· 920 次阅读

由于本周有java的实验课,所以本人写相关的博客,来拯救小伙伴!本次试验用到的软件是myeclipse,工作的环境是windows 10,下面我们开始揭晓本次实验的内容:
在这里插入图片描述
我们首先定义一个IntergerSet类,用来存放数组内杂乱无章的数据为了要做到从小到大,因此还需用到排序算法(在这里本人使用了冒泡排序)此类的代码如下:

package Test; import java.util.Scanner; public class IntegerSet { int[] a=new int[1000]; int k; int number; Scanner scanner=new Scanner(System.in); public void srpx(){ System.out.println("请输入数字个数k:"); k=scanner.nextInt(); System.out.println("请输入"+k+"个20-80之间的整数(k<=10):"); for(int i=0;i<k;i++){ a[i]=scanner.nextInt(); } for(int i=0;i<k-1;i++){ for(int j=0;j=a[j+1]){ int t=a[j+1]; a[j+1]=a[j]; a[j]=t; } } } System.out.println("排序后结果为:"); for(int i=0;i<k;i++){ System.out.print(a[i]+" "); } System.out.println(); } }

这里首先定义一个a数组,用来存放输入的数据,k代表数组内可存数组的个数,用scanner可以完成数据的输入!在这里定义一个方法srpx()意思是输入排序,我们将输入的数字一次存放入数组中。因为需要用到排序算法,我们这里运用简单易懂的冒泡排序:

for(int i=0;i<k-1;i++){ for(int j=0;j=a[j+1]){ int t=a[j+1]; a[j+1]=a[j]; a[j]=t; } } }

接下来我们开始调用这个函数,新建一个Java文件,讲一下代码写入该文件的main函数中!

package Test; import java.util.*; public class IntegerSetjg { private static final int NULL = 0; //private static final IntegerSet IntegerSet = null; public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner=new Scanner(System.in); int flag = 0; int count=0; int count2=0; int k=0; int max; int crsj; int l; int r; int scsj; int y=0; int[] b=new int[20]; IntegerSet s1=new IntegerSet(); IntegerSet s2=new IntegerSet(); s1.srpx(); s2.srpx(); if(s1.k>s2.k){ max=s1.k; }else{ max=s2.k; } for(int i=0;i<max;i++){ if(s1.a[i]==s2.a[i]){ flag=1; //System.out.println("交集为:"); //System.out.print(s1.a[i]+" "); }else{ flag=0; } } if(flag==1){ System.out.println("s1与s2相等!"); }else{ System.out.println("s1与s2不相等!"); } System.out.println("交集为:"); for(int i=0;i<max;i++){ for(int j=0;j<max;j++){ if(s1.a[i]==s2.a[j]){ System.out.print(s1.a[i]+" "); } } } System.out.println(); System.out.println("并集为:"); for(int i=0;i<s1.k;i++){ b[i]=s1.a[i]; } for(int i=s1.k;i<s1.k+s2.k;i++){ b[i]=s2.a[i-s1.k]; } for(int i=0;i<s1.k+s2.k-1;i++){ for(int j=0;j=b[j+1]){ int t=b[j+1]; b[j+1]=b[j]; b[j]=t; } } } for(int i=0;i<s1.k+s2.k-1;i++){ if(b[i]==b[i+1]){ count2++; for(int j=i;j<s1.k+s2.k-1;j++){ b[j]=b[j+1]; } } } //System.out.print(20-count2/2+" "); for(int i=0;i<s1.k+s2.k-count2/2;i++){ System.out.print(b[i]+" "); } System.out.println(); System.out.println("0代表输入s1,1代表输入s2:"); l=scanner.nextInt(); System.out.println("请输入需要插入的数据:"); crsj=scanner.nextInt(); if(l==0){ if(s1.k==10){ System.out.println("数组长度不够,无法插入!!!"); }else{ s1.a[s1.k++]=crsj; System.out.print("插入后:"); for(int i=0;i<s1.k;i++){ System.out.print(s1.a[i]+" "); } } }else{ if(s2.k==10){ System.out.println("数组长度不够,无法插入!!!"); }else{ s2.a[s2.k++]=crsj; System.out.print("插入后:"); for(int i=0;i<s1.k;i++){ System.out.println(s2.a[i]+" "); } } } System.out.println(); System.out.println("--------------------删除数据-----------------"); System.out.println("0代表输入s1,1代表输入s2:"); r=scanner.nextInt(); System.out.println("请输入需要删除的数据:"); scsj=scanner.nextInt(); if(r==0){ for(int i=0;i<s1.k;i++){ if(s1.a[i]==scsj){ y++; for(int c=i;c<s1.k;c++){ s1.a[c]=s1.a[c+1]; s1.a[c+1]=NULL; } for(int c=0;c<s1.k;c++){ System.out.print("删除后的结果为:"); System.out.print(s1.a[c]+" "); } break; }else{ if(y==s1.k){ System.out.println("找不到该数据,提醒未找到!"); } } } }else{ for(int i=0;i<s2.k;i++){ if(s2.a[i]==scsj){ y++; for(int c=i;c<s2.k;c++){ s2.a[c]=s2.a[c+1]; s2.a[c+1]=NULL; } for(int c=0;c<s2.k;c++){ System.out.print("删除后的结果为:"); System.out.print(s2.a[c]+" "); } break; }else{ if(y==s2.k){ System.out.println("找不到该数据,提醒未找到!"); } } } } /*for(int p=0;p<count;p++){ for(int i=p;i<10;i++){ if(b[p]==s1.a[i]){ continue; }else{ k=i; count++; b[count]=s1.a[k]; } } } for(int p=0;p<count;p++){ for(int i=p+count1;i<10;i++){ if(b[p]==s2.a[i]){ continue; }else{ k=i; count++; count1++; b[count]=s2.a[k]; } } } for(int p=0;p<count;p++){ System.out.print(b[p]+" "); }*/ /*int[] k=new int[10]; int[] c=new int[10]; int count1=0; int count2=0; */ /* int k=0; int c=0; System.out.println(); System.out.println("并集为:"); for(int i=0;i<10;i++){ for(int j=0;j<10;j++){ if(s1.a[i]==s2.a[j]){ System.out.print(s1.a[i]+" "); }else{ /*for(i=0;i<10;i++){ k[i]=j; count1++; }*/ /* k=i; c=j; } } } System.out.print(s1.a[k]+" "); for(int j=0;j<10;j++){ for(int i=0;i<10;i++){ if(s2.a[j]!=s1.a[i]){ /*for(int p=0;p<10;p++){ c[p]=i; count2++; }*/ /* c=j; } } } System.out.print(s2.a[c]+" ");*/ /*for(int i=0;i<count1;i++){ System.out.print(s2.a[k[i]]+" "); } for(int i=0;i<count2;i++){ System.out.print(s2.a[c[i]]+" "); }*/ } }

在这里本人因为当时心比较急,因此没有优化自己的代码,在这里理解起来会比较繁琐,请大家耐心收听!
代码一开始的定义变量和常量,flag用于作为旗帜,作为判断数组是否相等,如果两个数组相等,则输出1,如果不等则输出0,后续用于判断flag是等于1还是等于0,对应的输出相等或不等!
主要哟关于此段代码:

for(int i=0;i<max;i++){ if(s1.a[i]==s2.a[i]){ flag=1; //System.out.println("交集为:"); //System.out.print(s1.a[i]+" "); }else{ flag=0; } } if(flag==1){ System.out.println("s1与s2相等!"); }else{ System.out.println("s1与s2不相等!"); }

之后count,count2,都是用于记录次数的,k用于记录输入数据的数量,max用于记录拥有最大数组长度的数组,其用k长度比较具体代码如下:

if(s1.k>s2.k){ max=s1.k; }else{ max=s2.k; }

crsj用于存放存入的数据,scsj用于存放删除的数据!
交集的求法,其实很简单,就是逐个判断每个数据是否相等,如果相等则输出!
求交集的代码如下:

System.out.println("交集为:"); for(int i=0;i<max;i++){ for(int j=0;j<max;j++){ if(s1.a[i]==s2.a[j]){ System.out.print(s1.a[i]+" "); } } }

之后是并举的求法了,本人使用的方法可能比较繁琐,首先我先将这两个数据合并,记录他们的总个数,之后再对其运用冒泡排序,使他从小到大排序完成后,在注意前一项与后一项进行对比,如果相等则将后面的数据往前移替换掉重复的数据,这样就完成了相应的并集要求。
并集代码块如下:

System.out.println("并集为:"); for(int i=0;i<s1.k;i++){ b[i]=s1.a[i]; } for(int i=s1.k;i<s1.k+s2.k;i++){ b[i]=s2.a[i-s1.k]; } for(int i=0;i<s1.k+s2.k-1;i++){ for(int j=0;j=b[j+1]){ int t=b[j+1]; b[j+1]=b[j]; b[j]=t; } } } for(int i=0;i<s1.k+s2.k-1;i++){ if(b[i]==b[i+1]){ count2++; for(int j=i;j<s1.k+s2.k-1;j++){ b[j]=b[j+1]; } } } //System.out.print(20-count2/2+" "); for(int i=0;i<s1.k+s2.k-count2/2;i++){ System.out.print(b[i]+" "); }

接下来就是插入数据(插入到数组的末尾),这个比较简单,直接显示代码块:

System.out.println("0代表输入s1,1代表输入s2:"); l=scanner.nextInt(); System.out.println("请输入需要插入的数据:"); crsj=scanner.nextInt(); if(l==0){ if(s1.k==10){ System.out.println("数组长度不够,无法插入!!!"); }else{ s1.a[s1.k++]=crsj; System.out.print("插入后:"); for(int i=0;i<s1.k;i++){ System.out.print(s1.a[i]+" "); } } }else{ if(s2.k==10){ System.out.println("数组长度不够,无法插入!!!"); }else{ s2.a[s2.k++]=crsj; System.out.print("插入后:"); for(int i=0;i<s1.k;i++){ System.out.println(s2.a[i]+" "); } } }

注意的是我这里可以选择插入s1数组还是s2数组!
接下来是删除数据。
代码块为:

System.out.println("--------------------删除数据-----------------"); System.out.println("0代表输入s1,1代表输入s2:"); r=scanner.nextInt(); System.out.println("请输入需要删除的数据:"); scsj=scanner.nextInt(); if(r==0){ for(int i=0;i<s1.k;i++){ if(s1.a[i]==scsj){ y++; for(int c=i;c<s1.k;c++){ s1.a[c]=s1.a[c+1]; s1.a[c+1]=NULL; } for(int c=0;c<s1.k;c++){ System.out.print("删除后的结果为:"); System.out.print(s1.a[c]+" "); } break; }else{ if(y==s1.k){ System.out.println("找不到该数据,提醒未找到!"); } } } }else{ for(int i=0;i<s2.k;i++){ if(s2.a[i]==scsj){ y++; for(int c=i;c<s2.k;c++){ s2.a[c]=s2.a[c+1]; s2.a[c+1]=NULL; } for(int c=0;c<s2.k;c++){ System.out.print("删除后的结果为:"); System.out.print(s2.a[c]+" "); } break; }else{ if(y==s2.k){ System.out.println("找不到该数据,提醒未找到!"); } } } }

由于在调试时,如果没有y的判断时,会使得“找不到该数据,提醒未找到”重复输出,因此用y来判断尝试了所有的次数,到底了就说明没有找到与scsj相同的值!才会输出“找不到”!
这次代码较为繁琐本人在后续的学习中会对他进行相应的优化!


作者:L C H



JAVA 排序 解决问题 数组

需要 登录 后方可回复, 如果你还没有账号请 注册新账号