C++中实现java的方法(二)

C++中实现java的方法(二)-----ArrayList类

本章节主要是在讲解我在C++中实现的第一个java方法即:ArrayList

首先是说明一下:由于参考java方法并不能直接在C++中完美实现,所以本种方法只能最大限度的还原相关方法
简单样例如下

#include <iostream>
#include "ArrayList.cpp"
int main() {
   ArrayList<double> list=ArrayList<double>();
   list.add(2.5);
   list.add(3.5);
   list.add(1,4.5);
   list.remove(2.5);
   cout <<list.size()<<endl;
   print(list);
    return 0;
}

ArrayList是java中的动态数组,都隶属于List方法下,由于在C++中并没有这种方法,所以我自己将相关方法重写一下,删去了一些多余方法,保留了大部分方法
方法如下:

clone()复制当前数组,并返回
isEmpty()返回布尔类型,检测当前是否为空,空返回true
indexOf(Object o)返回第一个检测到的o的位置,如果没有就返回-1 
add(T t)在动态数组结尾添加个内容
add(int index, T t)在index位置加上个内容
size()返回目前该数组有的数据量,以int形式返回
get(int index)获取相应位置的数据
remove(Object o):移除此列表中首次出现的指定元素(如果存在,存在返回true)。
remove(int index):移除此列表中指定位置上的元素。
toString()返回当前动态数组的字符串形式,以string形式返回
set(int index, Object o)设置在index位置的内容为o
clear()清空当前动态数组
bool contains(Object o) 返回是否含有该内容的布尔类型,含有即为true
trimToSize() 删去多余的数组容量,变成实际容量
replace(Object old, Object newobj)将原有第一个的old内容换成新的newobj
remove(int start, Object old, Object newobj)增加了开始区间,其他同上
replaceAll(Object old, Object newobj)替换全部的old为newobj

为实现这种方法,我先利用的C++里面的基础template的方法
按照java中的习惯,本ArrayList方法中,总的泛型名称为Object
最开始使用的方法由于直接利用指针强制替换存在内存的内容,导致该种方法并不安全,所以在新的更新后采取了java中的方法,即在满后进行扩容,部分变量名来源java原生方法
由于C++中并没有相关Java的报错方法,所以采取了如下的方法来报错

if (index>= length||index<0)
        {
            string s="ArrayIndexOutOfBoundsException Index: ";
            ostringstream oss;
            oss<<index;
            s.append(oss.str());
            s.append(", Size: ");
            ostringstream oss2;
            oss2<<length;
            s.append(oss2.str());
            cout<<s;
            exit(1);
        }

利用这种方法,避免了指针指出数组的问题,同时可以报错,来很好的提醒编程者,有关错误
报错的内容来源于java原生方法
接下来就是本类方法的源码:

//按照java原生ArrayList编写
// 由开心创建于2020年
//使用方法参考开发日志
// this method is from java original method called ArrayList
// made by happy on 2020
// please read the CAVA development logs
//version 1.0
//@email :1013214271@qq.com
#include<iostream>
#include<string>
#include <sstream>
using namespace std;

template <class Object>
class ArrayList {
private:
    int DEFAULT_CAPACITY=10;
    int length =0;
    Object *arr=new Object[10];
    template<typename T> string TtoString(const T& t){
        ostringstream oss;
        oss<<t;
        return oss.str();
    }
    void makesure(){
        if(length==DEFAULT_CAPACITY){
            grow();
            if(length==DEFAULT_CAPACITY){
                DEFAULT_CAPACITY++;
                grow();
            }
        }
    }
    void grow(){
        DEFAULT_CAPACITY=DEFAULT_CAPACITY+(DEFAULT_CAPACITY>>1);
        Object* tmp=new Object[DEFAULT_CAPACITY];
        for (int i = 0; i <length; i++){
            tmp[i]=arr[i];
        }
        delete[] arr;
        arr=tmp;
    }
    int indexOfRange(Object o, int start, int end) {
        Object* tmp=clone();
        int i;
        if (o == NULL) {
            for(i = start; i < end; ++i) {
                if (tmp[i] == NULL) {
                    return i;
                }
            }
        } else {
            for(i = start; i < end; ++i) {
                if (o==tmp[i]) {
                    return i;
                }
            }
        }

        return -1;
    }
public :
    void replace(Object old, Object newobj) {
        for (int i=0;i<length;i++) {
            if (arr[i] == old) {
                arr[i]=newobj;
                return;
            }
        }
    }
    void replaceAll(Object old, Object newobj) {
        for (int i=0;i<length;i++) {
            if (arr[i] == old) {
                arr[i]=newobj;
            }
        }
    }
    void remove(int start, Object old, Object newobj) {
        if(start>=length||start<0) {
            string s="ArrayIndexOutOfBoundsException start: ";
            ostringstream oss;
            oss<<start;
            s.append(oss.str());
            s.append(", Size: ");
            ostringstream oss2;
            oss2<<length;
            s.append(oss2.str());
            cout<<s;
            exit(1);
        }
        for (int i=start; i<length;i++) {
            if (arr[i] == old) {
                arr[i]=newobj;
                return;
            }
        }
    }
    void trimToSize() {
        arr=clone();
        DEFAULT_CAPACITY=length;
    }
    bool contains(Object o) {
        return indexOf(o) >= 0;
    }
    Object* clone() {
        Object* o = new Object[length];
        for (int i = 0; i < length; i++){
            o[i]=arr[i];
        }
        return o;
    }
    bool isEmpty() {
        return length == 0;
    }
    int indexOf(Object o) {
        return indexOfRange(o, 0, length);
    }
    void add(Object t) {
        makesure();
        arr[length] = t;
        length++;
    }
    void add(int index, Object t) {
        if(index>length||index<0){
            string s="IndexOutOfBoundsException Index: ";
            ostringstream oss;
            oss<<index;
            s.append(oss.str());
            s.append(", Size: ");
            ostringstream oss2;
            oss2<<length;
            s.append(oss2.str());
            cout<<s;
            exit(1);
        }
        else if(index==length){
            add(t);
        }
        else{
            Object *ob;
            ob=new Object[length+1];
            for(int i=0;i<length+1;i++){
                if(i<index){
                    ob[i]=arr[i];
                }
                else if (i==index){
                    ob[index]=t;
                }
                else{
                    ob[i]=arr[i-1];
                }
            }
            delete[] arr;
            DEFAULT_CAPACITY++;
            arr=ob;
        }
        length++;
    }
    template  <class T>
    bool remove(T o) {
        for (int index = 0; index < length; index++){
            if (o==arr[index]) {
                remove(index);
                return true;
            }
        }
        return false;
    }
    void remove(int index){
        if(index>length||index<0){
            string s="IndexOutOfBoundsException Index: ";
            ostringstream oss;
            oss<<index;
            s.append(oss.str());
            s.append(", Size: ");
            ostringstream oss2;
            oss2<<length;
            s.append(oss2.str());
            cout<<s;
           exit(1);
        }
        else if(index==length){
            arr[index]=NULL;
        }
        else{
            for (int i = index; i <length-1 ; ++i) {
                arr[i]=arr[i+1];
            }
            arr[length]=NULL;
        }
        length--;
    }
    void set(int index, Object o){
        if (index>= length||index<0)
        {
            string s="ArrayIndexOutOfBoundsException Index: ";
            ostringstream oss;
            oss<<index;
            s.append(oss.str());
            s.append(", Size: ");
            ostringstream oss2;
            oss2<<length;
            s.append(oss2.str());
            cout<<s;
            exit(1);
        }
        else{
            arr[index]=o;
        }
    }
    int size() {
        return length;
    }
    void clear() {
        delete[] arr;
        DEFAULT_CAPACITY=10;
        length =0;
        arr=new Object[10];
    }
    Object get(int index) {
        if (index>= length||index<0)
        {
            string s="ArrayIndexOutOfBoundsException Index: ";
            ostringstream oss;
            oss<<index;
            s.append(oss.str());
            s.append(", Size: ");
            ostringstream oss2;
            oss2<<length;
            s.append(oss2.str());
            cout<<s;
            exit(1);
        }
        else
        {
            return arr[index];
        }
    }
    Object* toArray() {
        return arr;
    }
    string toString() {
        if (length==0)
        {
            string s2;
            s2="[]";
            return s2;
        }
        else
        {
            string s;
            s.append("[");
            int i=0;
            while(true){
                s.append(TtoString(get(i)));
                i++;
                if(i==length){
                    s.append("]");
                    return s;
                }
                s.append(", ");
            }
        }
    }
};

按照计划,下一章是linkedlist类,欢迎提出宝贵意见。帮助我进一步完善cava。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值