java多维数组与排序
一,数组补充内容
import java.util.Arrays; public class Array{ static String[] strs = new String[5]; public static void main(String[] args){ int[] arr = new int[]{7,5,8,2}; System.out.println(strs); //访问一下strs的第三个元素 System.out.println(strs[2]); //访问一下arr的第三个元素 System.out.println(arr[2]); System.out.println("-------------"); String str1 = new String("hello"); strs[0] = str1; //遍历arr //先new一个对象 Array at = new Array(); //调用遍历的方法,传入想要遍历的数组 at.showIntArray(arr); //使用jdk内置的数组打印方法,适合只查看数组 String result = Arrays.toString(arr); System.out.println(result); System.out.println("============================"); } //自定义一个int数组遍历的方法 //[7,5,8,2] public void showIntArray(int[] array){ for (int i=0; i<array.length;i++){ if(i==0){ System.out.print("["+array[i]+","); }else if(i== array.length-1){ System.out.print(array[i]+"]"); }else{ System.out.print(array[i]+","); } } } }
import java.util.Arrays; public class ArrayTest{ static int[] array = new int[]{2,4,6,8,1,3,5}; //准备一个计数的变量 static int size; public static void main(String[] args){ System.out.println(array); ArrayTest at = new ArrayTest(); Array at2 = new Array(); /* if(array==at.copyArray(array)){
System.out.println("地址相同,是同一块内存");
}else{
System.out.println("地址不同,不是同一个对象");
}
at2.showIntArray(at.copyArray(array)); */ /* System.out.println(array.length);
System.out.println(at.extendArray(array).length); */ /* array = new int[5];
for(int i=1;i<1000;i++){
at.add(i);
}
System.out.println(Arrays.toString(array)); */ //二维数组的声明和遍历 int[][] two = new int[3][3]; for(int i=0;i<two.length;i++){ for(int j=0;j<two[i].length;j++){ System.out.print(two[i][j]+"\t"); } System.out.println(); } } //数组的拷贝,以int数组为例 //要求:传入一个数组,得到该数组的拷贝数组(两个数组的地址是不一样的) public int[] copyArray(int[] oldArray){ //获得传入数组的长度 int len = oldArray.length; //第一步,声明一个新数组 int[] newArray = new int[len]; //第二步,把oldArray里的每一项取出来对应的赋值给newArray的每一项 for(int i=0;i<len;i++){ newArray[i] = oldArray[i]; } return newArray; } //数组的扩容 //要求一:写一个方法,传入一个int数组,每执行一次 //要求二:写一个方法,传入一个int数组和一个int数字,把int数组扩容int数字个长度 public int[] extendArray(int[] oldArray){ int len = oldArray.length; int[] newArray = new int[len*2]; for(int i=0;i<len;i++){ newArray[i]=oldArray[i]; } return newArray; } public int[] extendArray(int[] oldArray , int count){ int len = oldArray.length; int[] newArray = new int[len+count]; for(int i=0;i<len;i++){ newArray[i]=oldArray[i]; } return newArray; } //需求:给at2声明一个add方法,无限的向array中添加int数 public void add(int i){ //应该先判断array是否已经满了 //思路一:array是从空的开始添加 //可以准备一个计数的变量,每添加一次就记录一次, //当计数器等于array的初始化长度时,则证明满了 if(size == array.length){ array = extendArray(array,1); } array[size] = i; //思路二:array是一开始就有的初始化元素 //判断最后一位元素是否为0,如果不为0则满了 size++; } //根据下标去删除 public void remove(int index){ //删除的时候先判断是否为最后一个元素,如果是直接变为0 //如果不是最后一个元素,要注意把后面的元素向前移位 } }
一,二维数组
可以理解为数组中保存了数组的类型
{{1,2,3},
{4,5,6},
{7,8,9}}
二维数组的定义方式
int[][] array;
二维数组初始化
new int[2][3]; new int[2][]; //可以不指定列,但是一定要指定行
访问
int[2][3] = 10; int[0][0] = 1;
二维数组实例:
提供一个需求:
我们有一个三层楼的公寓,每一层三间房子,我们现在有六个学生,第一层住两个学生,这两个学生不想连着住,第二层住三个学生,第三层住一个学生,使用二维数组模拟一下住户图
先建立一个student类:
package com.briup.day06; public class Student { //提供成员 //属性 ---> 变量 String name; int age; String gender; //第一次使用一下构造器 public Student() { //如果一个类中没有定义任何的构造器 //则默认提供一个没有参数的构造器 } //给一个可以放名字的构造器 public Student(String name) { this.name = name; } //全参构造器 public Student(String name,int age,String gender) { this.name = name; this.age = age; this.gender = gender; } //方法 public void study() { } public void show() { } //设置名字的方法 public void setName(String newName) { name = newName; } //获取名字的方法 public String getName() { return name; } }
然后创建Test.java
package com.briup.day06; public class Test { public static void main(String[] args) { Student[][] room = new Student[3][3]; //Student的数组中保存的一定是Student的对象 Student s1 = new Student("tom"); Student s2 = new Student("jerry"); Student s3 = new Student("ben"); Student s4 = new Student("ken"); Student s5 = new Student("lisa"); Student s6 = new Student("ella"); //分配房间 room[0][0] = s1; room[0][2] = s2; room[1][0] = s3; room[1][1] = s4; room[1][2] = s5; room[2][0] = s6; //输出房间的分配图 //如果有人居住,则输出名字 //如果没有人居住,则输出无人居住 for(int i=0;i<room.length;i++) { for(int j=0;j<room.length;j++) { //三目运算符的使用场景 System.out.print((room[i][j]==null?"无人居住":room[i][j].getName())+"\t"); } System.out.println(); } } }
运行出的结果为
tom 无人居住 jerry
ben ken lisa
ella 无人居住 无人居住
二,eclipse的使用
1.使用之前确保jdk是好的
2.eclipse放在非中文非c盘的路径下
3.准备一个你喜欢的找得到的英文路径,创建一个文件夹javacode,作为工作空间(workplace)
4.开始第一个java工程
new—>project—>java project
5.新建一个包
右键src—>new—>package,输入包名
6.在对应的包里新建类
三,排序问题
例子:
数组a [8,3,1,5,3,2,6];
升序数列:[1,2,3,3,5,6,8];
降序数列:[8,6,5,3,3,2,1];
冒泡排序
相邻的两个两个进行比较,根据大小位置交换位置,过程为:
[8,3,1,5,3,2,6]
//第一次循环
[3,8,1,5,3,2,6]
[3,1,8,5,3,2,6]
[3,1,5,8,3,2,6]
[3,1,5,3,8,2,6]
[3,1,5,3,2,8,6]
[3,1,5,3,2,6,8]
//第二次循环
[1,3,5,3,2,6,8]
[1,3,3,5,2,6,8]
[1,3,3,2,5,6,8]
//第三次循环
…
直到
[1,2,3,3,5,6,8]
数组中进行对比的下标的组合
0 1
1 2
2 3
3 4
4 5
5 6
用程序来实现:
for(int i=0;i<a.length-1;i++){ for(int j=0;j<a.length-1-i){ if(a[j]<a[j+1]){ //交换位置(降序) //不使用第三方变量 //1.+= a[j] = a[j]+a[j+1]; a[j+1] = a[j] - a[j+1]; a[j] = a[j] - a[j+1]; //2.^ a[j] = a[j]^a[j+1]; a[j+1] = a[j]^a[j+1]; a[j] = a[j]^a[j+1]; //使用第三方变量 int temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } }
实例:
package com.briup.test; //冒泡排序 import java.util.Arrays; //ctrl+shift+o:监测需要导入的包和删除未使用的包 public class SortTest { //定义两个常量 static Boolean UP = true; static Boolean DOWN = false; public static void main(String[] args) { int[] array = new int[] {8,3,1,5,3,2,6}; System.out.println("排序前:"); System.out.println(Arrays.toString(array)); //排序,以升序为例 // array = sort(array,UP); // array = sort(array,DOWN);//如果是降序 //jdk有提供的自然排序方法 // Arrays.sort(array); for(int i=0;i<array.length-1;i++){ for(int j=0;j>array.length-1-i;j++) {//如果需要降序,将循环条件改为j<array.length-1-i if(array[j]<array[j+1]) { int temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } } System.out.println("排序后:"); System.out.println(Arrays.toString(array)); } //排序算法的封装 public static int[] sort(int[] array,boolean flag) { //判断一下是升序还是降序 if(flag) { for(int i=0;i<array.length-1;i++){ for(int j=0;j<array.length-1-i;j++) { if(array[j]>array[j+1]) { int temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } } }else { for(int i=0;i<array.length-1;i++){ for(int j=0;j<array.length-1-i;j++) { if(array[j]<array[j+1]) { int temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } } } return array; } }
剩下还有快速排序,希尔排序,插入排序,选择排序,今天暂时没有涉及到.
四,OOP 面向对象编程
类和对象的关系
类是一个相同属性和行为的对象的集合,只是起描述作用
对象是一个类的实际表现
清楚一个类有哪些内容
public class 类名{
类中有哪些成员?
变量
方法:
修饰符:
返回值:
方法名:
参数列表:
抛出异常:throws
方法体:
构造器.一般类中准备一个无参构造器和全参构造器
五,用数组来模拟栈的数据结构
package com.briup.test;
package com.briup.test; import sun.security.provider.certpath.IndexedCollectionCertStore; //使用数组来模拟栈的数据结构 //先进后出 //添加元素从尾部开始添加 //删除元素从尾部开始删除 public class Stack { int[] data; //储存数据 int size;//保存栈的实际长度 //使用构造器做初始化 public Stack() { data = new int[10]; } public Stack(int length) { data = new int[length]; } //入栈的方法 public void in(int i) { //判断栈是否溢出 if(size == data.length) { System.out.println("栈溢出,请检查"); } data[size++] = i; //size++; } //出栈的方法 public int out() { //判断栈是不是空了 if (size == 0) { System.out.println("栈已空,无数据可出"); } int temp = data[size-1]; data[size-1] = 0; size--; return temp; } //修改栈内指定位置的元素 public void change(int index,int number) { //判断index是否再size的范围 if (index<size) { data[index] = number; }else { System.out.println("输入索引有误"); } data[index] = number; } //获取栈的长度 public int size() { return size; } //输出栈的内容 public void show() { for(int i=0;i<size;i++) { System.out.println("当前栈中第"+(i+1)+"个元素是:"+data[i]); } } }
六,心得
今天的内容感觉比昨天的要简单一些,接受起来相对比较容易,可能是因为之前没有学过数组的相关内容的原因,今天自习时间都用来回顾昨天的内容了,到现在还是有一些地方一知半解,得利用这个周末来好好理清一下数组的相关内容.今天是第一天开始使用工具,也是深深感受到了工具的强大,明天加油!
本文地址:https://blog.csdn.net/lanaiwanqiQAQ/article/details/107700567