Java基础对每个程序员都非常重要,最近抽空开始复习Java基础部分,复习到数据结构与算法部分参考了美Robert Lafore的Java数据结构与算法第二版,收益匪浅。
故写下博客起到记录、监督自己继续学习的作用,同时也想与大家共同进步。
Java数组是Java语言数据结构的最基本组成之一,我在参照网上资料和该书的前提下,写下如下Java数组的增删查改的代码。
代码说明:1.以对象为基本元素,且本文的增删查改仅涉及单个数组元素,且为一维数组。
2.在数组中的特定位置插入特定值的算法参考了如下资料:Java数组的指定位置插入一个元素
3.第一次在CSDN上发博客,如代码有错误、不当或大家对实现算法有更好的看法,欢迎留言。
4.欢迎转载,请注明出处。
/**
* 对象数组设计及相关方法测试
* Created by Administrator on 2017/7/7.
*/
/**
* 人的类,仅有名字和年龄字段。
*/
class Person{
private String firstName;
private String lastName;
private int age;
/**
* 人类构造方法
* @param first
* @param last
* @param a
*/
public Person(String first,String last,int a){
firstName = first;
lastName = last;
age = a;
}
/**
* 对象元素显示方法,可用toString()方法代替
*/
public void displayPerson(){
System.out.println("firstName:"+firstName);
System.out.println("lastName:"+lastName);
System.out.println("age:"+age);
}
public String getLastName(){
return lastName;
}
public String getFirstName(){
return firstName;
}
public int getAge(){
return age;
}
@Override
public String toString() {
return "Person{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", age=" + age +
'}';
}
}
/**
* 存储人的类的对象数组,并可以进行增删查改(由于数组长度不可变,故增操作不可超过最大长度。)
*/
class DataArrayPerson{
private Person[] a;//初始化数组
int num;//元素下标
/**
* 对象数组构造方法
* @param max
*/
public DataArrayPerson(int max){//构造函数,仅初始化数组的最大元素容量
a= new Person[max];
num=0;
}
/**
* 初始化插入
* @param person
*/
public void insert(Person person){//向数组中插入人对象
a[num]=person;
num++;
}
/**
* 特定位置插入数组元素
* 方法:构造第二个数组来移动插入元素后的所有元素
* @param key , p
*/
public int insertByKeyAndValue(int key, Person p){
// System.out.println(a.length); //元素个数
Person [] b = new Person[a.length+1];//由于要移动插入元素后的所有元素,故长度要加1
if(key<0||key>=a.length){//判断当前插入位置的下标是否合法
return -1;
}else {
for (int i = 0; i < a.length; i++) {
b[i]=a[i];//将a数组的所有元素移到b数组,b数组空出最后一个位置
}
for (int i=key; i< b.length-1;i++){
b[i+1]=a[i];//将报括从插入位置开始的原先的元素向后移,插入的位置空出
}
b[key]=p;//插入元素
a=b;//还原
return 1;
}
}
public void delete(String searchKey){//按数组-对象-关键字的方式找到值然后删除
if (find(searchKey)==-1){
System.out.println("此人不存在,无法删除!");
}else{
for (int j = find(searchKey); j < num; j++) {
a[j]=a[j+1];
}
num--;
System.out.println("删除指定对象后的数组为:");
displayDataArray();
}
}
public int find(String searchName){//按人的首名查询
int i;
for (i = 0; i < num; i++) {
if (a[i].getFirstName().equals(searchName)){
break;
}
}
if (i==num){
return -1;
}
return i;
}
/**
* 打印数组
*/
public void displayDataArray(){
for (int i = 0; i < a.length; i++) {
if (a[i]==null){
continue;//当前元素为空则跳出当前循环
}
System.out.println("当前元素为:"+a[i]+",当前下标为:"+i);
}
}
}
/**
* 测试类
*/
public class ClassDateApp {
public static void main(String[] args) {
Person p0 = new Person("li","bai",34);
Person p1 = new Person("ma","bai0",34);
Person p2 = new Person("zhao","bai1",34);
Person p3 = new Person("sun","bai2",34);
Person p4 = new Person("zhou","bai3",34);
Person p5 = new Person("wu","bai4",34);
Person p6 = new Person("xu","bai5",34);
Person p7 = new Person("zhu","bai6",34);
Person p8 = new Person("feng","bai7",34);
Person p9 = new Person("chen","bai8",34);
Person pt = new Person("ceshi","baice",35);
Person pt1 = new Person("ceshi1","baice1",35);
DataArrayPerson da = new DataArrayPerson(100);
da.insert(p0);
da.insert(p1);
da.insert(p2);
da.insert(p3);
da.insert(p4);
da.insert(p5);
da.insert(p6);
da.insert(p7);
da.insert(p8);
da.insert(p9);
/**
* 根据人的姓查找(也可根据其它方式查找,方法相同)
*/
int findIndex=da.find("lao");
if (findIndex==-1){
System.out.println("此人不存在!");
}else {
System.out.println("此人存在且元素下标为:"+findIndex);
}
/**
* 插入指定元素第一次测试
*/
if (da.insertByKeyAndValue(4,pt)==-1){
System.out.println("键值不合法!");
}else {
System.out.println("插入成功!新数组为:");
da.displayDataArray();
}
/**
* 插入指定元素第二次测试
*/
if (da.insertByKeyAndValue(36,pt1)==-1){
System.out.println("键值不合法!");
}else {
System.out.println("插入成功!新数组为:");
da.displayDataArray();
}
/**
* 删除方法测试
*/
da.delete("xu");
}
}
从上述代码可以看出,由于无序数组在插入时不需要寻找特定位置,故无序数组的插入时间复杂度为O(1)。而其它如有序数组的插入、数组元素的删除时间复杂度都为O(N),因为它们都需要寻找特定位置且要移动过半以上的元素。
其它与数组相关的算法时间复杂度总结:
线性查找:O(N),二分查找O(logN)。